如何在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
相关产品推荐
相关产品推荐

