如何在ggplot饼图中添加填充图案且保持分组底色一致?
实现方案
你提到的需求用ggpattern完全可以实现,只要调整映射逻辑,把基础色和填充图案分开映射即可,具体步骤和修改后的代码如下:
1. 预处理数据
给数据集新增两个字段:
major_group:对应你说的30个大分组,同大组的基础色统一sub_group:对应大组下的子分组,同大组下不同子分组对应不同填充图案
2. 预定义映射规则
提前配置好你需要的基础色和图案列表:
- 大组基础色直接用你原来的
glasbey()取30个色即可 - 图案列表可以根据最大子分组数量设置,比如
c("none", "stripe", "circle", "crosshatch"),分别对应纯色、条纹、点状、十字纹,覆盖你说的最多4个子分组的需求
3. 修改绘图代码
把原来的geom_bar替换为ggpattern的图案图层即可,示例代码如下:
library(ggplot2) library(ggpattern) library(ggsci) # 你用到的glasbey色可从该包调用 # 先手动定义图案映射规则,把所有子分组对应的图案补全即可 pattern_list <- c("1a" = "none", "1b" = "stripe", "1c" = "circle", "2a" = "none", "2b" = "stripe") bpwc <- ggplot(data, aes(x = "", y = rel_abund)) + # 核心图案图层设置 geom_col_pattern( width = 1, color = "black", aes( fill = major_group, # 基础色映射大分组 pattern = sub_group # 图案映射子分组 ), pattern_colour = "#00000030", # 图案颜色设为半透黑,也可调整为同色系深色 pattern_alpha = 0.7, pattern_spacing = 0.02, # 调整图案密度 pattern_size = 0.1 # 调整图案线条粗细 ) + coord_polar("y", start = 0) + theme_void() + facet_wrap(depth~replicate) + # 大组分色沿用你原来的glasbey方案 scale_fill_manual(values = glasbey(30)) + # 子分组对应图案映射 scale_pattern_manual(values = pattern_list) print(bpwc)
自定义调整说明
- 如果要实现子分组的图案和基础色同色(比如红色底加红色条纹),把
pattern_colour参数改成after_scale(fill)即可 - 除了内置图案外,还可以自定义纹理、梯度图案,完全满足子分组区分需求
- 图例可以通过
guides(fill = guide_legend(order = 1), pattern = guide_legend(order = 2))调整显示顺序,也可以按需合并显示
内容的提问来源于stack exchange,提问作者croberts16
相关产品推荐
相关产品推荐

