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" # 垂直排列图例,合并种群相关项 )
关键实现要点
- 数据统一处理:避免拆分数据集,新增
group列标记种群类型,解决图例分离问题。 - 符号与颜色映射:
- 特殊种群使用支持填充的实心shape(21-25),绑定
fill映射到种群颜色; - 非特殊种群使用仅支持边框的空心shape(1-4),绑定
color映射到种群颜色。
- 特殊种群使用支持填充的实心shape(21-25),绑定
- 图例合并:通过
guides()将fill和color的图例合并为“种群”项,同时保留“物种”符号图例,最终形成整合的单图例区域;用override.aes强制图例中显示对应实心/空心符号。
内容的提问来源于stack exchange,提问作者Manuel Tiburtini
相关产品推荐
相关产品推荐

