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

ggplot2实现分组Dodge+堆叠柱状图并按年龄类着色的方法

解决方案

要实现你需要的「处理组避让、年龄组堆叠并按年龄分色」的柱状图,调整ggplot的映射逻辑和分组方式即可,具体代码和说明如下:

修正后的代码

library(ggplot2)

# 设置随机种子确保结果可复现(可选)
set.seed(123)
df <- expand.grid(name = c("hyalina","copepod","bosmina"),
                  age = c("juvenileS","juvenileL","adult"),
                  type = c("tapwater", "pondwater"))
df$count <- sample(5:200, size = nrow(df), replace = T)

ggplot(df, aes(x = interaction(name, type), y = count, fill = age)) +
  # 堆叠年龄组,保留黑色边框
  geom_col(position = "stack", color = "black") +
  # 调整x轴标签,让同一处理组的标签统一显示
  scale_x_discrete(
    labels = rep(c("tapwater", "pondwater"), 3),
    breaks = interaction(c("hyalina", "copepod", "bosmina"), c("tapwater", "tapwater", "tapwater"))
  ) +
  # 设置坐标轴和图例标签(可根据需求调整语言)
  labs(
    x = "处理组",
    y = "计数",
    fill = "年龄组"
  ) +
  # 自定义年龄组配色(可选,替换为你需要的颜色)
  scale_fill_manual(
    values = c("juvenileS" = "#FF6B6B", "juvenileL" = "#4ECDC4", "adult" = "#45B7D1"),
    labels = c("幼体S", "幼体L", "成体")
  ) +
  # 优化主题样式(可选)
  theme_bw()

关键调整说明

  1. 处理组避让实现:用interaction(name, type)将物种和处理组组合为x轴的独立类别,同一物种的不同处理组会生成并排的柱子,自然实现避让效果。
  2. 年龄组颜色区分:将fill映射从原代码的name改为age,让每个年龄组的堆叠部分显示不同颜色。
  3. 堆叠逻辑设置:通过position = "stack"让同一x类别(物种+处理组)下的年龄组计数堆叠,柱高自动计算为三个年龄组的计数总和。
  4. x轴标签优化:用scale_x_discrete调整标签,让同一处理组的标签统一显示,避免x轴出现重复的物种名称,提升可读性。

最终效果

  • 每个处理组对应三组柱子,分别对应三个物种;
  • 每个物种的柱子内部按年龄组堆叠,不同年龄组用不同颜色区分;
  • 柱子边框保留黑色,柱高为对应物种+处理组下三个年龄组的计数总和。

内容的提问来源于stack exchange,提问作者Kevin the Crew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:57:34