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

ggplot2实现双分组双堆叠柱状图的技术求助

分组堆叠柱状图实现方案

要同时实现Type为X轴、Geno分组、Count与subcount堆叠且按Geno区分颜色的需求,核心是先将数据转换为长格式,再通过ggplot2的分组与堆叠逻辑组合实现。

步骤1:数据格式转换

原数据是宽格式(Count和subcount为独立列),需要转成长格式,新增类别列区分Count和subcount:

# 加载tidyverse包(包含dplyr、tidyr、ggplot2)
library(tidyverse)

# 转换为长格式
df_long <- df %>%
  pivot_longer(
    cols = c(Count, subcount),  # 指定要转换的列
    names_to = "Value_Category",  # 新增类别列的名称
    values_to = "Value"  # 数值列的名称
  )

步骤2:绘制目标柱状图

通过interaction(Type, Geno)构建X轴的分组逻辑,让同一Type下的不同Geno柱子并列;同时用Value_Category实现每个柱子内部的堆叠,再通过interaction(Geno, Value_Category)设置填充色,确保同一Geno的Count和subcount颜色不同:

ggplot(df_long, aes(x = interaction(Type, Geno), y = Value, fill = interaction(Geno, Value_Category))) +
  # 绘制堆叠柱状图
  geom_col(position = position_stack()) +
  # 调整X轴标签,只显示Type(隐藏Geno后缀)
  scale_x_discrete(labels = function(x) str_split(x, "\\.", simplify = TRUE)[,1]) +
  # 手动设置颜色:同一Geno的Count用深色,subcount用同色系浅色
  scale_fill_manual(
    values = c(
      "A.Count" = "#e74c3c", "A.subcount" = "#f5b7b1",
      "B.Count" = "#3498db", "B.subcount" = "#aed6f1",
      "C.Count" = "#2ecc71", "C.subcount" = "#abebc6"
    ),
    # 调整图例标签,提升可读性
    labels = c(
      "A.Count" = "A - Count", "A.subcount" = "A - subcount",
      "B.Count" = "B - Count", "B.subcount" = "B - subcount",
      "C.Count" = "C - Count", "C.subcount" = "C - subcount"
    )
  ) +
  # 设置坐标轴和图例标题
  labs(x = "Type", y = "数值", fill = "Geno & 数值类型") +
  # 使用简洁主题
  theme_minimal()

效果说明

  • X轴显示Type,同一Type下自动生成3个并列柱子(对应Geno A/B/C)
  • 每个柱子底部为Count值,顶部堆叠subcount值,总高度为两者之和
  • 填充色按Geno区分,同一Geno的Count和subcount使用同色系深浅色,辨识度高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:45:34