R 在不改变绘图顺序的情况下翻转图例顺序

R 在不改变绘图顺序的情况下翻转图例顺序,r,ggplot2,R,Ggplot2,我发现,使用ggplot2将coord_flip()添加到某些绘图时,图例中的值顺序不再与绘图中的值顺序一致 例如: dTbl = data.frame(x=c(1,2,3,4,5,6,7,8), y=c('a','a','b','b','a','a','b','b'), z=c('q','q','q','q','r','r','r','r')) print(ggplot(dTbl, aes(x=factor(y),y=x

我发现,使用ggplot2将
coord_flip()
添加到某些绘图时,图例中的值顺序不再与绘图中的值顺序一致

例如:

dTbl = data.frame(x=c(1,2,3,4,5,6,7,8),
                  y=c('a','a','b','b','a','a','b','b'),
                  z=c('q','q','q','q','r','r','r','r'))

print(ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
      geom_bar(position=position_dodge(), stat='identity') +
      coord_flip() +
      theme(legend.position='top', legend.direction='vertical'))

我希望图例中的“q”和“r”可以颠倒,而不改变绘图中“q”和“r”的顺序


scale.x.reverse()
看起来很有希望,但它似乎不在因素范围内工作(如此条形图所示)。

您正在寻找的
指南

ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
      geom_bar(position=position_dodge(), stat='identity') +
      coord_flip() +
      theme(legend.position='top', legend.direction='vertical') + 
      guides(fill = guide_legend(reverse = TRUE))
Brian在聊天中提醒我,对于任意排序,有一种更通用的方法,通过设置
breaks
参数:

ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
      geom_bar(position=position_dodge(), stat='identity') +
      coord_flip() +
      theme(legend.position='top', legend.direction='vertical') + 
      scale_fill_discrete(breaks = c("r","q"))

如果你不喜欢乔兰优雅的回答,你可以选择以下方式:

geom_bar(position=position_dodge(-.9), stat='identity')

对于任意级别的重新排序,您可以在
因子
中修改
级别
的顺序:

dTbl$z=factor(dTbl$z,levels=c('r','q'))
ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
       geom_bar(position=position_dodge(), stat='identity') +
       coord_flip() +
       theme(legend.position='top', legend.direction='vertical')

+1,显然是更好的答案,但出于好奇,仍然保留另一个答案。这只适用于颠倒级别标签的顺序,但我们不能随意重新排列级别。@PauloCardoso很好地指出,但这里不需要这样做,因为当与coord_flip()发生冲突时,标签可能会反转,也可能不会反转(最有可能)@保罗卡多索真的。我似乎记得过去曾与这个普遍的问题作过斗争。恐怕没有一个很好的通用解决方案(即图例值的任意排序,与绘图中显示的内容无关)。@joran谢谢!这是我从未用过的东西。它是否已经为我们节省了操纵因子水平的顺序?美好的请务必注意,这也颠倒了级别在图表中的显示顺序。@Joran回答了具体的问题,但这正是我所认为的更灵活的选项。=)这可能无法解决问题,因为无论使用ggplot()之前的任意级别顺序如何,一旦应用了coord_flip(),绘图中的条/线顺序仍然与图例中的顺序相反。