如何用ggpattern的scale_pattern_manual实现多物种组合条形图可视化?
解决方案:用图案叠加简化多物种组合的条形图
你的核心问题是没有正确给geom_bar_pattern映射图案相关的美学属性,只添加了图层但没指定图案的样式、颜色规则。下面提供两种可行的修改方案,帮你实现「单一物种底色+共存物种图案」的简化视觉效果:
方案1:先整理样式规则(推荐,易维护)
先把所有物种/组合的底色、图案、图案颜色统一整理成规则表,再合并到数据中,后续修改样式更方便:
library(ggplot2) library(ggpattern) library(dplyr) library(tibble) # 1. 定义单一物种的基础颜色 sp_base_colors <- c( "Ae. aegypti" = "#DA4943", "Ae. polynesiensis" = "#5284D9", "Cx. spp." = "#E5AD3F", "Toxo. amboinensis" = "#67E5C8", "W. mitchellii" = "#A259DB" ) # 2. 定义多物种组合的样式规则:底色用主物种,图案用共存物种的颜色 combo_styles <- tibble( sp = c( "Ae. aegypti + Ae. polynesiensis", "Ae. aegypti + Cx. spp.", "Ae. aegypti + Toxo. amboinensis", "Ae. polynesiensis + W. mitchellii", "Ae. aegypti + Ae. polynesiensis + Cx. spp." ), fill = c( sp_base_colors["Ae. aegypti"], sp_base_colors["Ae. aegypti"], sp_base_colors["Ae. aegypti"], sp_base_colors["Ae. polynesiensis"], sp_base_colors["Ae. aegypti"] ), pattern = c("stripe", "stripe", "stripe", "stripe", "crosshatch"), pattern_fill = c( sp_base_colors["Ae. polynesiensis"], sp_base_colors["Cx. spp."], sp_base_colors["Toxo. amboinensis"], sp_base_colors["W. mitchellii"], sp_base_colors["Cx. spp."] ) ) # 3. 合并单一物种和组合的样式规则 all_sp_styles <- bind_rows( tibble( sp = names(sp_base_colors), fill = sp_base_colors, pattern = "none", pattern_fill = NA_character_ ), combo_styles ) # 4. 绘制图表 x11(); ggppt <- Tabagg %>% filter(!(type_gîtes %in% "na")) %>% filter(pres_larve %in% "Oui") %>% filter(!(sp %in% "na")) %>% left_join(all_sp_styles, by = "sp") %>% # 合并样式规则到数据 ggplot() + aes( x = type_gîtes, fill = fill, pattern = pattern, pattern_fill = pattern_fill, pattern_color = pattern_fill # 图案线条颜色与填充色一致 ) + geom_bar_pattern( pattern_density = 0.3, # 调整图案密度,避免太密集 pattern_spacing = 0.05 # 调整图案间距 ) + labs( x = "Type gîte", y = "N", fill = "Espèces principales", pattern = "Espèces associées" ) + coord_flip() + theme_minimal() + theme( legend.text.align = 0, legend.position = "bottom" ) + # 使用identity类scale直接应用数据中的颜色/图案值 scale_fill_identity( name = "Espèces", labels = lapply(all_sp_styles$sp, function(s) { # 自动生成斜体标签 parts <- strsplit(s, " \\+ ")[[1]] if (length(parts) == 1) { expression(italic(!!s)) } else { expr <- parse(text = paste(paste0("italic('", parts, "')"), collapse = " + ")) expr[[1]] } }), guide = "legend" ) + scale_pattern_manual( name = "Espèces", values = setNames(all_sp_styles$pattern, all_sp_styles$sp), na.value = "none", guide = "none" # 隐藏图案单独的图例,合并到底色图例 ) + scale_pattern_fill_identity() + scale_pattern_color_identity() ggppt
方案2:直接在Scale中定义规则(快速修改)
如果不想整理数据,可以直接在scale_*_manual中给每个物种/组合指定底色、图案和图案颜色:
library(ggplot2) library(ggpattern) x11(); ggppt <- Tabagg %>% filter(!(type_gîtes %in% "na")) %>% filter(pres_larve %in% "Oui") %>% filter(!(sp %in% "na")) %>% ggplot() + aes( x = type_gîtes, fill = sp, pattern = sp, pattern_fill = sp ) + geom_bar_pattern( pattern_density = 0.3, pattern_spacing = 0.05 ) + labs(x = "Type gîte", y = "N", fill = "Espèces") + coord_flip() + theme_minimal() + theme(legend.text.align = 0, legend.position = "bottom") + # 定义底色:单一物种用自身颜色,组合用主物种颜色 scale_fill_manual( name = "Espèces", values = c( "Ae. aegypti" = "#DA4943", "Ae. aegypti + Ae. polynesiensis" = "#DA4943", "Ae. aegypti + Ae. polynesiensis + Cx. spp." = "#DA4943", "Ae. aegypti + Cx. spp." = "#DA4943", "Ae. aegypti + Toxo. amboinensis" = "#DA4943", "Ae. polynesiensis" = "#5284D9", "Ae. polynesiensis + W. mitchellii" = "#5284D9", "Cx. spp." = "#E5AD3F", "Toxo. amboinensis" = "#67E5C8", "W. mitchellii" = "#A259DB" ), labels = c( expression(italic("Ae. aegypti")), expression(italic("Ae. aegypti + Ae. polynesiensis")), expression(italic("Ae. aegypti + Ae. polynesiensis + Cx. spp.")), expression(italic("Ae. aegypti + Cx. spp.")), expression(italic("Ae. aegypti + Toxo. amboinensis")), expression(italic("Ae. polynesiensis")), expression(italic("Ae. polynesiensis + W. mitchellii")), expression(italic("Cx. spp.")), expression(italic("Toxo. amboinensis")), expression(italic("W. mitchellii")) ) ) + # 定义图案:单一物种无图案,组合用对应样式 scale_pattern_manual( name = "Espèces", values = c( "Ae. aegypti" = "none", "Ae. aegypti + Ae. polynesiensis" = "stripe", "Ae. aegypti + Ae. polynesiensis + Cx. spp." = "crosshatch", "Ae. aegypti + Cx. spp." = "stripe", "Ae. aegypti + Toxo. amboinensis" = "stripe", "Ae. polynesiensis" = "none", "Ae. polynesiensis + W. mitchellii" = "stripe", "Cx. spp." = "none", "Toxo. amboinensis" = "none", "W. mitchellii" = "none" ), guide = "none" ) + # 定义图案颜色:用共存物种的颜色 scale_pattern_fill_manual( name = "Espèces", values = c( "Ae. aegypti" = NA, "Ae. aegypti + Ae. polynesiensis" = "#5284D9", "Ae. aegypti + Ae. polynesiensis + Cx. spp." = "#E5AD3F", "Ae. aegypti + Cx. spp." = "#E5AD3F", "Ae. aegypti + Toxo. amboinensis" = "#67E5C8", "Ae. polynesiensis" = NA, "Ae. polynesiensis + W. mitchellii" = "#A259DB", "Cx. spp." = NA, "Toxo. amboinensis" = NA, "W. mitchellii" = NA ), guide = "none" ) ggppt
关键说明
geom_bar_pattern需要明确映射pattern(图案样式)、pattern_fill(图案填充色)等属性,不能仅添加图层。- 通过统一的样式规则,你可以把多物种组合的底色和主物种保持一致,用图案颜色区分共存物种,大幅减少视觉复杂度。
- 调整
pattern_density和pattern_spacing参数可以优化图案的清晰度,避免和底色冲突。
内容的提问来源于stack exchange,提问作者HMK
相关产品推荐
相关产品推荐

