使用coord_flip()在ggplot2条形图中的图例条目顺序

Mat*_*eoS 12 r ggplot2

我正在努力在我用R中的ggplot2制作的图表中获得正确的变量排序.

假设我有一个数据帧,例如:

set.seed(1234)
my_df<- data.frame(matrix(0,8,4))
names(my_df) <- c("year", "variable", "value", "vartype")
my_df$year <- rep(2006:2007)
my_df$variable <- c(rep("VX",2),rep("VB",2),rep("VZ",2),rep("VD",2))
my_df$value <- runif(8, 5,10) 
my_df$vartype<- c(rep("TA",4), rep("TB",4))
Run Code Online (Sandbox Code Playgroud)

产生下表:

  year variable    value vartype
1 2006       VX 5.568517      TA
2 2007       VX 8.111497      TA
3 2006       VB 8.046374      TA
4 2007       VB 8.116897      TA
5 2006       VZ 9.304577      TB
6 2007       VZ 8.201553      TB
7 2006       VD 5.047479      TB
8 2007       VD 6.162753      TB
Run Code Online (Sandbox Code Playgroud)

有四个变量(VX,VB,VZ和VD),属于两组变量类型(TA和TB).

我想将值绘制为y轴上的水平条,首先按变量组垂直排序,然后按变量名称排序,按年份分面,x轴上的值和填充颜色对应于变量组.(即在这个简化的例子中,顺序应该是,从上到下,VB,VX,VD,VZ)

1)我的第一次尝试是尝试以下方法:

ggplot(my_df,        
    aes(x=variable, y=value, fill=vartype, order=vartype)) +
       # adding or removing the aesthetic "order=vartype" doesn't change anything
     geom_bar() + 
     facet_grid(. ~ year) + 
     coord_flip()
Run Code Online (Sandbox Code Playgroud)

但是,变量按反向字母顺序列出,但不是按vartype列出:order=vartype美学被忽略.

在此输入图像描述

2)在我昨天发布的类似问题的答案之后,我尝试了以下内容,基于ggplot2条形图中的订单栏:

my_df$variable <- factor(
  my_df$variable, 
  levels=rev(sort(unique(my_df$variable))), 
  ordered=TRUE
)
Run Code Online (Sandbox Code Playgroud)

这种方法确实在图中以垂直字母顺序获取变量,但忽略了变量应该首先通过变量goups排序的事实(TA变量位于顶部,TB变量位于下方).

在此输入图像描述

3)以下与2(上述)相同:

my_df$vartype <- factor(
  my_df$vartype, 
  levels=sort(unique(my_df$vartype)), 
  ordered=TRUE
)
Run Code Online (Sandbox Code Playgroud)

...与第一种方法有相同的问题(以反向字母顺序列出的变量,忽略组)

4)另一种方法,基于ggplot2条形图中订单栏的原始答案,也给出了与上面2相同的平台

my_df <- within(my_df, 
                vartype <- factor(vartype, 
                levels=names(sort(table(vartype),
                decreasing=TRUE)))
                ) 
Run Code Online (Sandbox Code Playgroud)

令我感到困惑的是,尽管有几种方法,但美学order=vartype被忽略了.不过,它似乎与一个无关的问题有关:http://learnr.wordpress.com/2010/03/23/ggplot2-changing-the-default-order-of-legend-labels-and-stacking-of-data /

我希望问题很清楚,欢迎提出任何建议.

马特奥

我昨天发布了一个类似的问题,但遗憾的是,在解决问题并提供可重复的示例时,我犯了几个错误.我已经听了几个建议,并且彻底搜索了stakoverflow的类似问题并应用,据我所知,每个建议的解决方案组合都无济于事. 我再次发布问题,希望能够解决我的问题,并希望能够对其他人有所帮助.

Rei*_*son 10

这与ggplot几乎没有关系,而是关于生成用于重新排序因子级别的变量排序的问题.这是您的数据,使用各种功能实现以更好地实现:

set.seed(1234)
df2 <- data.frame(year = rep(2006:2007), 
                  variable = rep(c("VX","VB","VZ","VD"), each = 2),
                  value = runif(8, 5,10),
                  vartype = rep(c("TA","TB"), each = 4))
Run Code Online (Sandbox Code Playgroud)

注意这种方式variablevartype因素.如果它们不是因素,ggplot()则强制它们然后按字母顺序排列.我以前说过这个,毫无疑问会再说一遍; 让您的数据转换成正确的格式第一 之前,你开始策划/执行数据分析.

您需要以下订购:

> with(df2, order(vartype, variable))
[1] 3 4 1 2 7 8 5 6
Run Code Online (Sandbox Code Playgroud)

你应该注意的是,我们通过得到的排序vartype第一,然后才由variable 水平vartype.如果我们使用它来重新排序variable我们得到的水平:

> with(df2, reorder(variable, order(vartype, variable)))
[1] VX VX VB VB VZ VZ VD VD
attr(,"scores")
 VB  VD  VX  VZ 
1.5 5.5 3.5 7.5 
Levels: VB VX VD VZ
Run Code Online (Sandbox Code Playgroud)

(忽略attr(,"scores")位并专注于级别).这有正确的顺序,但ggplot()会从底部到顶部绘制它们,你想要从上到下.我不太熟悉ggplot()知道这是否可以控制,所以我们还需要decreasing = TRUE在调用中反转使用顺序order().

把这一切放在一起我们有:

## reorder `variable` on `variable` within `vartype`
df3 <- transform(df2, variable = reorder(variable, order(vartype, variable,
                                                         decreasing = TRUE)))
Run Code Online (Sandbox Code Playgroud)

当与您的绘图代码一起使用时:

ggplot(df3, aes(x=variable, y=value, fill=vartype)) +
       geom_bar() + 
       facet_grid(. ~ year) + 
       coord_flip()
Run Code Online (Sandbox Code Playgroud)

产生这个:

重新排序的barplot

  • @MatteoS`scale_fill_discrete(guide = guide_legend(reverse = TRUE))`将等同于`top.down = TRUE`来反转图例中的顺序. (4认同)
  • 我感谢您的解决方案!有用。然而,通过彻底的搜索,我还发现我原来的问题是使用 coord_flip() 时常见麻烦的特殊情况。 (2认同)
  • 现在我明白了,但ggplot2就是问题所在.使用coord_flip(),轴被翻转,最初排序的变量L-> R然后被排序为B - > T,而图例与它们不匹配. (2认同)