如何绘制含两组分组与误差棒的堆叠柱状图?
解决方案:绘制带分组与误差棒的堆叠柱状图
问题说明
需基于土壤数据集生成满足以下要求的可视化图表:
- X轴为
Time(包含May 21、July 21、July 22三个水平) - 每个
Time刻度下,按Treatment(T1-T4)分组并排展示柱子 - 每个柱子内部按
Fraction堆叠,要求Fine earth堆叠在Plant remains之上 - 展示误差棒(均值±标准误)
步骤1:加载依赖包并预处理数据
使用dplyr计算分组统计量,同时生成堆叠总高度数据(用于总误差棒展示):
library(dplyr) library(ggplot2) # 计算分组统计:均值、标准差、样本量、标准误 summ_data <- datas %>% group_by(Time, Treatment, Fraction) %>% summarise( mean_corg = mean(Corg, na.rm = TRUE), sd_corg = sd(Corg, na.rm = TRUE), n = n(), se_corg = sd_corg / sqrt(n), .groups = "drop" ) %>% # 确保Fine earth堆叠在Plant remains上方 arrange(Time, Treatment, desc(Fraction)) %>% # 计算每个Time-Treatment组合的堆叠总高度 group_by(Time, Treatment) %>% mutate(total_mean = cumsum(mean_corg)) %>% ungroup()
步骤2:绘制单块误差棒的堆叠分组图
此方案展示每个堆叠部分的独立误差棒:
ggplot(summ_data, aes(x = Time, y = mean_corg, fill = Fraction)) + # 实现分组并排+内部堆叠的柱子 geom_col(aes(group = Treatment), position = position_dodge2(width = 0.8, preserve = "single"), width = 0.7) + # 添加堆叠块的误差棒,位置与柱子对齐 geom_errorbar(aes(ymin = mean_corg - se_corg, ymax = mean_corg + se_corg), position = position_dodge2(width = 0.8, preserve = "single"), width = 0.2, color = "black") + # 使用指定配色方案 scale_fill_manual(values = c("Fine earth" = "darkgoldenrod4", "Plant remains" = "darkolivegreen4")) + # 设置坐标轴标签与主题 labs(x = "采样时间", y = "Corg含量", fill = "组分") + theme_classic()
步骤3:绘制总误差棒的堆叠分组图
若仅需展示每个Treatment柱子的总误差(堆叠顶部),使用以下代码:
ggplot(summ_data, aes(x = Time, fill = Fraction)) + # 分组并排+堆叠柱子 geom_col(aes(y = mean_corg, group = Treatment), position = position_dodge2(width = 0.8, preserve = "single"), width = 0.7) + # 在堆叠顶部(Fine earth)添加总误差棒 geom_errorbar(data = summ_data %>% filter(Fraction == "Fine earth"), aes(y = total_mean, ymin = total_mean - se_corg, ymax = total_mean + se_corg, group = Treatment), position = position_dodge2(width = 0.8, preserve = "single"), width = 0.2, color = "black") + scale_fill_manual(values = c("Fine earth" = "darkgoldenrod4", "Plant remains" = "darkolivegreen4")) + labs(x = "采样时间", y = "Corg含量", fill = "组分") + theme_classic()
关键说明
- 使用
position_dodge2(preserve = "single")实现:同一Time下的不同Treatment柱子并排,每个柱子内部按Fraction堆叠 - 误差棒的
position参数需与柱子完全一致,确保位置对齐 - 通过
arrange(desc(Fraction))强制Fine earth处于堆叠上层
内容的提问来源于stack exchange,提问作者marinaaa2809
相关产品推荐
相关产品推荐

