我正在尝试将变量归入变量并按降序排序。
mydf
region airport value
MIA FLL 0.244587909
MIA PBI 0.824144687
MIA MIA 0.484907626
NYC EWR 0.731075565
NYC LGA 0.708648915
NYC HPN 0.523991258
LAX LGB 0.651847818
LAX LAX 0.423607479
LAX SNA 0.433837044
LAX ONT 0.723144957
Other MCO 0.657586674
Other SJC 0.084138321
Other OAK 0.698794154
Other BOS 0.85765002
Other BNA 0.018953126
Other WAS 0.234897245
Run Code Online (Sandbox Code Playgroud)
https://i.stack.imgur.com/G1E2k.jpg
我正在尝试复制上面的图。
这是第一次尝试:
ggplot(mydf, aes(x=airport,y=value, fill = region)) +
geom_bar(stat = "identity")
Run Code Online (Sandbox Code Playgroud)
这是第二次尝试:
ggplot(mydf, aes(x=reorder(airport,-value,sum),y=value, fill = region)) +
geom_bar(stat = "identity")
Run Code Online (Sandbox Code Playgroud)
我被困在这里。我可以嵌套重新排序吗?reorder(reorder(x, y), y)我不想不必手动进行每个分组。
mydf$order <- c('ONT','LGB','SNA','LAX','PBI','MIA','FLL','EWR','LGA','HPN','BOS','OAK','MCO','WAS','SJC','BNA')
ggplot(mydf, aes(x=airport,y=value, fill = region, order = order)) +
geom_bar(stat = "identity")
Run Code Online (Sandbox Code Playgroud)
这仍然行不通。我将不胜感激!
@ eipi10有一个很好的答案,但我经常发现自己需要这样做,另外还要考虑其他一些变量,因此使用该forcats软件包还有其他选择:
require(dplyr)
require(forcats)
mydf %>%
mutate(ordering = -as.numeric(region) + value,
airport = fct_reorder(airport, ordering, .desc = T)) %>%
ggplot(aes(airport, value, fill = region)) + geom_col()
Run Code Online (Sandbox Code Playgroud)
这是一个示例,说明如何可能需要同时使用排序和构面,并在其中添加+ facet_grid(~fac, scales = "free_x", space = "free_x")了名为“ fac”的另一列以及我的旅行历史记录:
要通过value在每个区域内减小而进行region排序,我们在区域内region依次进行排序,然后value在区域内进行排序,然后airport按照级别的排序顺序转换为因子。然后,我们使用构面为每个区域获取单独的面板。
library(tidyverse)
ggplot(mydf %>% arrange(region, desc(value)) %>%
mutate(airport=factor(airport, levels=airport)),
aes(x=airport,y=value, fill = region)) +
geom_bar(stat="identity", show.legend=FALSE) +
geom_text(aes(label=round(value,2), y=0.5*value), colour="white", size=3) +
facet_grid(. ~ region, scales="free_x", space="free_x") +
scale_y_continuous(limits=c(-0.005, 1.05*max(mydf$value)), expand=c(0,0)) +
theme_classic() +
theme(panel.spacing=unit(0,"pt"),
panel.border=element_rect(colour="grey50", fill=NA))
Run Code Online (Sandbox Code Playgroud)