You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

关键说明

  1. geom_bar_pattern需要明确映射pattern(图案样式)、pattern_fill(图案填充色)等属性,不能仅添加图层。
  2. 通过统一的样式规则,你可以把多物种组合的底色和主物种保持一致,用图案颜色区分共存物种,大幅减少视觉复杂度。
  3. 调整pattern_density和pattern_spacing参数可以优化图案的清晰度,避免和底色冲突。

内容的提问来源于stack exchange,提问作者HMK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:40:30