我发现使用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()
看起来很有希望,但它似乎并不适用于各种因素(就像这个条形图的情况一样)。
答案 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)
对于任意级别重新排序,您可以修改levels
中factor
的顺序:
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')