ggplot2图案填充柱状图 合并颜色与图案为单一统一图例
ggpattern填充色+图案统一合并图例实现方法
核心原理
ggplot2会自动将名称、标签、排序规则完全一致的同分组美学图例合并,之前出现独立双图例、或是图例缺图案的问题,本质是两个标度的图例配置没有对齐,或是错误关闭了其中一个美学的图例引导。
操作步骤
- 确保
geom_bar_pattern()里fill和pattern_type两个美学都映射到同一个分组字段:即你的收入来源列。 - 给
scale_fill_manual()和scale_pattern_type_discrete()设置完全相同的图例标题、分类顺序、分类标签,两个标度的values参数按相同的分类顺序传入自定义颜色、自定义图案列表。 - 不要给任意一个标度设置
guide = 'none',两个标度统一使用适配图案展示的图例引导函数,强制图形输出合并后的单图例。
可直接套用的代码模板
library(ggplot2) library(ggpattern) # 1. 先定义统一的分类规则,保证颜色、图案、标签、排序完全对应 income_category <- c("项1","项2", "...") # 替换为你实际的13项收入构成名称,顺序固定 custom_fill <- c("#色值1","#色值2", "...") # 对应顺序的自定义填充色 custom_pattern <- c("stripe","crosshatch", "...") # 对应顺序的magick模式支持的填充图案 # 2. 绘图 ggplot(你的数据集, aes(x = 国家维度, y = 收入数值, fill = 收入来源列, pattern_type = 收入来源列)) + geom_bar_pattern( stat = "identity", position = "stack", pattern = "magick", # 保留你原有的magick渲染模式 pattern_color = NA, # 按需调整图案描边色,设为NA可去掉描边 pattern_density = 0.3 # 按需调整图案疏密 ) + scale_fill_manual( name = "收入构成", # 两个标度的图例名必须完全一致 values = custom_fill, breaks = income_category, labels = income_category, guide = guide_legend_pattern() # 用ggpattern专属图例引导 ) + scale_pattern_type_discrete( name = "收入构成", # 和fill的图例名完全一致 values = custom_pattern, breaks = income_category, labels = income_category, guide = guide_legend_pattern() ) + # 兜底统一图例配置,避免版本兼容问题 guides( fill = guide_legend_pattern(title = "收入构成", ncol = 2), # 13项设为2列显示更美观 pattern_type = guide_legend_pattern(title = "收入构成", ncol = 2) )
常见问题排查
- 如果图例里图案和颜色错配:检查两个标度的
breaks顺序是否完全一致,必须保证颜色、图案和分类项的顺序一一对应。 - 如果还是出现双图例:检查两个标度的
name参数是否完全相同,有没有多余的空格、大小写差异。 - 如果旧版本ggpattern找不到
guide_legend_pattern()函数:直接替换成原生guide_legend()即可,只要标度配置对齐,一样可以实现合并,只是图案渲染效果略差,升级ggpattern到最新版即可解决。 - 如果图例里图案显示太密/太疏:在
guide_legend_pattern()里加override.aes = list(pattern_density = 0.2, pattern_scale = 0.8)参数,单独调整图例里的图案显示效果,不影响主图。
内容的提问来源于stack exchange,提问作者Luca Giangregorio
相关产品推荐
相关产品推荐

