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

时间:2014-03-19 20:09:33

标签: 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, fill=z)) +
      geom_bar(position=position_dodge(), stat='identity') +
      coord_flip() +
      theme(legend.position='top', legend.direction='vertical'))

enter image description here

我希望图例中的'q'和'r'不会改变图中'q'和'r'的顺序。

scale.x.reverse()看起来很有希望,但它似乎并不适用于各种因素(就像这个条形图的情况一样)。

3 个答案:

答案 0 :(得分:29)

您正在寻找guides

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"))

答案 1 :(得分:2)

对于任意级别重新排序,您可以修改levelsfactor的顺序:

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')

答案 2 :(得分:1)

如果你不喜欢joran的优雅答案,你可以选择hack:

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