如何在ggplot中为指定类别添加图案并配置双图例
带填充色与条纹图案的双图例柱状图实现方案
需求说明
需要绘制柱状图,实现三个核心效果:
- 按
group4字段设置柱子填充颜色 - 仅为
group3中的"CCSS"类别添加条纹图案 - 生成两个独立的图例(分别对应填充色和条纹图案)
问题分析
原代码通过叠加geom_bar和geom_col_pattern导致填充色被覆盖,且未对图案显示做针对性控制,无法实现预期的双图例效果。
解决代码
# 过滤掉value为空的行,避免空柱子 data_filtered <- data[!is.na(data$value), ] # 加载依赖包 library(ggplot2) library(ggpattern) # 绘制柱状图 ggplot(data_filtered, aes(x = as.factor(id), y = value)) + geom_col_pattern( aes(fill = group4, pattern = group3), width = 0.95, colour = "black", # 柱子边框颜色 pattern_density = 0.5, # 条纹密度 pattern_fill = "black", # 条纹填充色 pattern_colour = "black" # 条纹线条色 ) + # 自定义图案映射:仅CCSS显示条纹,SJLIFE无图案 scale_pattern_manual( values = c("CCSS" = "stripe", "SJLIFE" = "none"), name = "数据源", breaks = c("CCSS", "SJLIFE") ) + # 自定义填充颜色(可根据需求调整) scale_fill_manual( values = c("All treatments" = "#619CFF", "PRS" = "#F8766D"), name = "处理类型" ) + # 自定义标签与主题 labs( x = "样本ID", y = "数值", title = "按数据源与处理类型分组的统计柱状图" ) + theme_minimal()
关键调整说明
- 合并图层:直接使用
geom_col_pattern同时映射fill和pattern属性,避免图层叠加导致的样式冲突。 - 图案控制:通过
scale_pattern_manual指定仅"CCSS"显示条纹,"SJLIFE"无图案,确保图例仅展示有效类别。 - 图例自定义:分别设置两个图例的名称和样式,让填充色(处理类型)与条纹(数据源)的对应关系清晰。
- 数据预处理:过滤
value为空的行,避免生成无意义的空柱子。
内容的提问来源于stack exchange,提问作者Achal Neupane
相关产品推荐
相关产品推荐

