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

如何绘制含两组分组与误差棒的堆叠柱状图?

解决方案:绘制带分组与误差棒的堆叠柱状图

问题说明

需基于土壤数据集生成满足以下要求的可视化图表:

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:36:59