如何使用ggplot调整堆叠柱状图分段顺序,将other组置于堆叠底部
ggplot堆叠柱状图调整other分组至最底部的实现方案
问题背景
使用ggplot绘制分类学堆叠柱状图时,默认按数值大小排序堆叠分段,会导致丰度较低的other分组出现在堆叠中段,影响图表整洁度,需要将其固定到堆叠最底部。
现有绘图代码如下:
ggplot(full_genus_new, aes(x=as.factor(Var2), y=value, fill=Var1)) + geom_bar(stat="identity", position = "fill", aes(order = -value)) + scale_x_discrete() + ylab("Relative Microbial Activity") + facet_grid(cols=vars(PEDIS), scales = "free_x", space = "free_x") + theme_classic() + scale_fill_manual(values = Cb64k) + scale_y_continuous(labels=percent_format()) + theme(legend.position = "bottom", legend.text = element_text(size=8)) + guides(fill=guide_legend(title="Taxa")) + xlab("Patient") + theme(legend.key.size = unit(0.5,'cm'))
使用的是长格式数据框,其中Var2字段对应患者信息,Var1字段为分类群名称。
解决方法
有两种常用实现方案,优先推荐修改因子水平的方式:
- 方案1:调整
Var1的因子水平,固定other排序优先级
ggplot默认按照分类变量的因子水平从下到上堆叠,只需将other设为因子的第一个水平,其余分类按需求排序即可,同时可以同步统一图例顺序:
# 载入依赖包,已安装可跳过 library(dplyr) library(forcats) # 重设Var1因子水平,other放在第一位,其余分类按总丰度降序排列 full_genus_new <- full_genus_new %>% mutate(Var1 = fct_relevel(Var1, "other"), Var1 = fct_reorder(Var1, value, .fun = sum, .desc = TRUE))
修改数据后,原有绘图代码中geom_bar里的aes(order = -value)参数可以删除,直接运行即可得到other在最底部的堆叠效果。
- 方案2:不修改原始数据,直接在绘图参数中指定排序
如果不想改动原始数据的因子结构,可以直接在geom_bar的aes中单独指定other的排序优先级:
ggplot(full_genus_new, aes(x=as.factor(Var2), y=value, fill=Var1)) + # 给other单独设置最高排序优先级,保证其在最底部 geom_bar(stat="identity", position = "fill", aes(order = ifelse(Var1 == "other", 1, -value))) + # 以下原有代码保持不变 scale_x_discrete() + ylab("Relative Microbial Activity") + facet_grid(cols=vars(PEDIS), scales = "free_x", space = "free_x") + theme_classic() + scale_fill_manual(values = Cb64k) + scale_y_continuous(labels=percent_format()) + theme(legend.position = "bottom", legend.text = element_text(size=8)) + guides(fill=guide_legend(title="Taxa")) + xlab("Patient") + theme(legend.key.size = unit(0.5,'cm'))
内容的提问来源于stack exchange,提问作者mrad
相关产品推荐
相关产品推荐

