You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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绘制堆叠柱状图时,会按照因子的水平顺序排列堆叠层次,这样就能和图例顺序对应。

修改步骤:

  1. 在绘图代码前,将tmp.df$parameters转换为因子,设置levels = ord.eng
  2. 可保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:07:40