如何使用ggplot2和ggpattern为条形图特定部分添加条纹
解决方案
1. 安装并加载依赖包
要实现带条纹的填充效果,需要用到基础绘图包ggplot2和扩展填充图案的ggpattern:
install.packages(c("ggplot2", "ggpattern")) library(ggplot2) library(ggpattern)
2. 数据预处理
给41个唯一的CTaa_beta值分配颜色和条纹标记:
# 提取所有唯一的CTaa_beta值 unique_ct <- unique(topclones$CTaa_beta) # 前26个用ggplot默认的alphabet2调色板,剩余的统一用深灰色 color_mapping <- c(scales::hue_pal()(26), rep("#333333", length(unique_ct) - 26)) names(color_mapping) <- unique_ct # 新增列标记是否需要添加条纹:前26个不需要,剩下的需要 topclones$need_stripe <- topclones$CTaa_beta %in% unique_ct[27:length(unique_ct)]
3. 绘制分组条形图
用geom_col_pattern替代普通geom_col,通过pattern参数控制条纹显示,同时绑定颜色映射:
ggplot(topclones, aes(x = Group, y = Percent, fill = CTaa_beta)) + geom_col_pattern( aes(pattern = need_stripe), pattern_fill = "white", # 条纹颜色,与深灰色形成明显对比 pattern_density = 0.1, # 条纹密度,数值越小越稀疏 pattern_spacing = 0.02, # 条纹间距 position = position_dodge(0.9)# 保持分组条形对齐,与默认geom_col一致 ) + # 绑定颜色映射 scale_fill_manual(values = color_mapping) + # 设置图案规则:不需要条纹的用"none",需要的用"stripe" scale_pattern_manual(values = c(FALSE = "none", TRUE = "stripe")) + # 自定义图表标签 labs( title = "分组条形图:Group vs Percent(按CTaa_beta区分)", x = "Group", y = "Percent", fill = "CTaa_beta" ) + theme_minimal()
关键细节说明
scales::hue_pal()(26)生成的颜色与ggplot默认的alphabet2调色板完全一致,保证前26个类别颜色正常显示- 剩余类别统一用深灰色+白色条纹,既解决了颜色不足的问题,又能清晰区分普通彩色条形和重复颜色的条形
position_dodge(0.9)确保分组条形的间距与普通geom_col一致,避免错位
内容的提问来源于stack exchange,提问作者Zoya Qaiyum
相关产品推荐
相关产品推荐

