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

如何在R中绘制带误差棒的双Y值堆叠柱状图?

实现带误差棒的堆叠柱状图步骤

1. 加载必要的包

先装上数据处理和绘图的工具包,tidyverse用来整理数据,ggplot2负责绘图(你之前用的ggpubr也是基于它的):

library(tidyverse)
library(ggplot2)
# 要是想继续用ggpubr,再加一行:library(ggpubr)

2. 把宽数据转成“长格式”

堆叠柱状图要求数据是长格式——简单说就是把原来分开的Yield1和Yield2列合并成一列,用另一列标记是哪种产量。用pivot_longer就能搞定:

df_long <- df %>%
  pivot_longer(cols = starts_with("Yield"),  # 选中所有以Yield开头的列
               names_to = "Yield_Type",      # 新列名:区分Yield1/Yield2
               values_to = "Yield_Value")    # 新列名:存对应的产量数值

转完之后,每个处理组下会同时有Yield1和Yield2的所有重复记录,方便后续分组计算。

3. 绘制堆叠图+误差棒(两种方法任选)

方法一:用ggplot直接画(推荐,灵活度高)

你可以先提前计算好均值和标准误,再绘图:

# 先汇总每个处理组+产量类型的均值和标准误
df_summary <- df_long %>%
  group_by(Treatment, Yield_Type) %>%
  summarise(
    mean_yield = mean(Yield_Value, na.rm = TRUE),
    se_yield = sd(Yield_Value, na.rm = TRUE)/sqrt(n()),  # 标准误的计算逻辑和mean_se一致
    .groups = "drop"
  )

# 绘图
ggplot(df_summary, aes(x = Treatment, y = mean_yield, fill = Yield_Type)) +
  geom_col(position = position_stack()) +  # 画堆叠柱状图
  geom_errorbar(aes(ymin = mean_yield - se_yield, ymax = mean_yield + se_yield),
                position = position_stack(vjust = 0.5),  # 让误差棒居中在每个堆叠块上
                width = 0.2) +  # 误差棒的宽度
  labs(title = "堆叠产量柱状图(带标准误)",
       x = "处理组",
       y = "产量均值",
       fill = "产量类型") +
  theme_minimal()

嫌提前汇总麻烦?也可以直接在绘图时让ggplot自动计算均值和误差:

ggplot(df_long, aes(x = Treatment, y = Yield_Value, fill = Yield_Type)) +
  stat_summary(fun = mean, geom = "col", position = position_stack()) +  # 自动算均值画柱子
  stat_summary(fun.data = mean_se, geom = "errorbar",  # 自动算均值+标准误画误差棒
               position = position_stack(vjust = 0.5), width = 0.2) +
  labs(title = "堆叠产量柱状图(带标准误)",
       x = "处理组",
       y = "产量均值",
       fill = "产量类型") +
  theme_minimal()

方法二:用你熟悉的ggpubr实现

ggbarplot默认是单y值,转成长数据后用fill区分堆叠组,再加上误差棒:

library(ggpubr)

ggbarplot(df_long, x = "Treatment", y = "Yield_Value", 
          fill = "Yield_Type", position = position_stack()) +
  stat_summary(fun.data = mean_se, geom = "errorbar", 
               position = position_stack(vjust = 0.5), width = 0.2) +
  labs(title = "堆叠产量柱状图(带标准误)",
       x = "处理组",
       y = "产量均值",
       fill = "产量类型")

关键提醒

  • 宽转长是必须的,这是堆叠图的核心前提,不然ggplot没法识别要堆叠的两组数据。
  • position_stack(vjust = 0.5)一定要加,不然误差棒会跑到整个柱子的顶部/底部,和对应的堆叠块错位。

内容的提问来源于stack exchange,提问作者Warren McAuley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:40:05