在ggplot2中订购多个变量

Rya*_*ohn 4 r ggplot2

我正在尝试将变量归入变量并按降序排序。

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)

这仍然行不通。我将不胜感激!

Bri*_*ian 6

@ 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”的另一列以及我的旅行历史记录:

在此处输入图片说明

  • 请注意,要使此答案起作用,“mydf$region”需要成为一个因素。作为字符,排序不起作用,因为“as.numeric(region)”给出 NA。阅读问题和答案时我并不清楚这一点。 (3认同)

eip*_*i10 5

要通过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)

在此处输入图片说明