如何让ggplot2的geom_col堆叠柱状图按指定顺序排列堆叠元素
解决geom_col堆叠柱状图顺序与图例不一致的问题
问题描述
希望用geom_col()绘制堆叠柱状图,数据集如下:
tmp.df <- data.frame( original = c(2.68, 1.05, 72.89, 11.81, 11.67, 2.85, 1.11, 72.74, 12.05, 11.95), sensitivity = c('Si', 'Si', 'Si', 'Si', 'Si', 'STi', 'STi', 'STi', 'STi', 'STi'), parameters = c('OMd', 'ED6_N', 'CP', 'dr_N', 'GE', 'OMd', 'ED6_N', 'CP', 'dr_N', 'GE') )
编写的绘图代码如下:
ord.eng <- c("CP", "GE", "OMd", "ED6_N", "dr_N") library(ggplot2) ggplot(tmp.df, aes(x = sensitivity, y = original))+ geom_col(aes(fill = parameters), width = 0.5, color = "black")+ ggtitle("Nu/Total N excretion") + xlab("Sobol index")+ ylab("Sobol indices (%)")+ theme_classic()+ theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 18), axis.text.x = element_text(color = "black", size = 18), axis.text.y = element_text(color = "black", size = 18), axis.title = element_text(face = "bold", size = 18, color = "black"), legend.text = element_text(size = 15), legend.title = element_text(hjust = 0.5, size = 15))+ scale_y_continuous(breaks = seq(0, 140, 20))+ scale_fill_manual(name = "Variables", limits = ord.eng, values = c("CP" = "White", "GE" = "ivory", "OMd" = "ivory3", "ED6_N" = "gray", "dr_N" = "black"))
执行后仅图例顺序变为ord.eng指定的顺序,但柱状图的堆叠顺序并未同步,需要让堆叠顺序与图例顺序一致。
解决方案
要让堆叠顺序和图例顺序匹配,核心是将parameters列转换为有序因子,并指定因子的水平顺序为ord.eng。ggplot绘制堆叠柱状图时,会按照因子的水平顺序排列堆叠层次,这样就能和图例顺序对应。
修改步骤:
- 在绘图代码前,将
tmp.df$parameters转换为因子,设置levels = ord.eng - 可保留
scale_fill_manual的配置,确保图例样式与需求一致
修改后的完整代码:
ord.eng <- c("CP", "GE", "OMd", "ED6_N", "dr_N") # 将parameters转换为指定顺序的因子 tmp.df$parameters <- factor(tmp.df$parameters, levels = ord.eng) library(ggplot2) ggplot(tmp.df, aes(x = sensitivity, y = original))+ geom_col(aes(fill = parameters), width = 0.5, color = "black")+ ggtitle("Nu/Total N excretion") + xlab("Sobol index")+ ylab("Sobol indices (%)")+ theme_classic()+ theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 18), axis.text.x = element_text(color = "black", size = 18), axis.text.y = element_text(color = "black", size = 18), axis.title = element_text(face = "bold", size = 18, color = "black"), legend.text = element_text(size = 15), legend.title = element_text(hjust = 0.5, size = 15))+ scale_y_continuous(breaks = seq(0, 140, 20))+ scale_fill_manual(name = "Variables", values = c("CP" = "White", "GE" = "ivory", "OMd" = "ivory3", "ED6_N" = "gray", "dr_N" = "black"))
修改后,柱状图的堆叠顺序会与ord.eng指定的顺序完全一致,同时图例顺序也保持匹配。
内容的提问来源于stack exchange,提问作者S. Jeon
相关产品推荐
相关产品推荐

