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

