使用coord_flip()后如何保持分组条形图内的条形顺序?
解决coord_flip()反转分组条形顺序的问题
我之前也遇到过这个问题!coord_flip()确实会悄悄反转每组内条形的顺序——这是因为它在翻转坐标轴的同时,也会反转离散型变量的绘制顺序。不过有几个简单的办法能让你保持原来的Group A到D的展示顺序:
方法1:给position_dodge加上reverse=TRUE参数
这是最直接的解决方案,相当于让条形的排列顺序再反转一次,抵消coord_flip()带来的反转效果。修改你的代码如下:
ggplot(all_Q, aes(x=qid, y=correct_per, fill=group)) + geom_bar(stat="identity", position=position_dodge(reverse = TRUE)) + scale_x_discrete(limits = as.character(16:1)) + coord_flip()
方法2:提前反转group因子的顺序
既然coord_flip()会反转顺序,那我们可以先把group的因子水平反过来,这样翻转后就回到你想要的A→B→C→D顺序:
# 先修改group的因子水平顺序(记得如果需要保留原始数据,可先备份) all_Q$group <- factor(all_Q$group, levels = rev(c("A", "B", "C", "D"))) # 再执行绘图代码 ggplot(all_Q, aes(x=qid, y=correct_per, fill=group)) + geom_bar(stat="identity", position="dodge") + scale_x_discrete(limits = as.character(16:1)) + coord_flip()
方法3:用scale_fill_discrete强制指定顺序
通过手动设置填充色的顺序,既能锁定每组内条形的展示顺序,还能保证图例顺序和条形顺序一致:
ggplot(all_Q, aes(x=qid, y=correct_per, fill=group)) + geom_bar(stat="identity", position="dodge") + scale_x_discrete(limits = as.character(16:1)) + scale_fill_discrete(limits = c("A", "B", "C", "D")) + # 强制指定分组顺序 coord_flip()
你可以用自己提供的子集数据测试以上方法,都能让每组内的条形回到原来的Group A至D的排列顺序~
内容的提问来源于stack exchange,提问作者Ivan Bacher
相关产品推荐
相关产品推荐

