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

ggplot2与ggstar中geom_point和geom_star图层的图例合并问题

PCoA图单图例实现:实心/空心符号区分种群,颜色对应物种

问题说明

现有PCoA数据集,包含10个特殊种群(需用实心符号展示)和4个非特殊种群(需用空心符号展示)。需求为生成单图例散点图:

  • 每个符号对应一个物种
  • 每种颜色对应一个种群(覆盖两类种群)
  • 特殊种群用实心符号,非特殊种群用空心符号

解决方案代码

set.seed(123) # 固定随机种子,保证结果可复现
df <- data.frame(
  Species = sort(rep(letters[1:14], 10)), # 14个物种,对应14个种群
  Locality = sort(rep(c(LETTERS[1:10], LETTERS[11:14]), 10)), # A-J为特殊种群,K-N为非特殊种群
  Axis.1 = rnorm(140, 0, 0.7),
  Axis.2 = rnorm(140, 0, 0.7)
)

special <- c("A","B","C","D","E","F","G","H","I","J") # 特殊种群:实心符号
non_special <- c("K","L","M","N") # 非特殊种群:空心符号

# 新增分组列,标记种群类型
df$group <- ifelse(df$Locality %in% special, "special", "non_special")

# 定义物种-符号映射:特殊物种用实心shape(支持fill),非特殊用空心shape(仅color)
species_shapes <- c(
  setNames(c(21,22,23,24,25,21,22,23,24,25), letters[1:10]),
  setNames(c(1,2,3,4), letters[11:14])
)

# 定义种群-颜色映射
locality_colors <- setNames(rainbow(14), c(special, non_special))

library(ggplot2)

ggplot(df, aes(x = Axis.1, y = Axis.2)) +
  # 统一绘制所有点,根据种群类型设置填充/边框颜色
  geom_point(aes(
    shape = Species,
    fill = ifelse(group == "special", Locality, NA),
    color = ifelse(group == "non_special", Locality, NA)
  ), size = 3) +
  # 配置符号映射
  scale_shape_manual(values = species_shapes) +
  # 配置特殊种群的填充颜色
  scale_fill_manual(name = "种群", values = locality_colors, na.value = NA) +
  # 配置非特殊种群的边框颜色
  scale_color_manual(name = "种群", values = locality_colors, na.value = NA) +
  # 合并图例,整合种群颜色与物种符号
  guides(
    shape = guide_legend(title = "物种", order = 1),
    fill = guide_legend(title = "种群", order = 2, override.aes = list(shape = 21)),
    color = guide_legend(title = "种群", order = 2, override.aes = list(shape = 1))
  ) +
  # 样式优化
  theme_bw() +
  xlab("Axis.1 (30%)") +
  ylab("Axis.2 (20%)") +
  theme(
    panel.grid = element_blank(),
    legend.title = element_text(hjust = 0.5),
    axis.text = element_text(size = 15, colour = "black"),
    axis.title = element_text(size = 12, face = "bold"),
    legend.box = "vertical" # 垂直排列图例,合并种群相关项
  )

关键实现要点

  1. 数据统一处理:避免拆分数据集,新增group列标记种群类型,解决图例分离问题。
  2. 符号与颜色映射:
    • 特殊种群使用支持填充的实心shape(21-25),绑定fill映射到种群颜色;
    • 非特殊种群使用仅支持边框的空心shape(1-4),绑定color映射到种群颜色。
  3. 图例合并:通过guides()将fill和color的图例合并为“种群”项,同时保留“物种”符号图例,最终形成整合的单图例区域;用override.aes强制图例中显示对应实心/空心符号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:55:18