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

如何在ggplot2中合并带形状的两个图例并替换现有图例?

在ggplot2中合并颜色与形状图例

要合并你代码中color(关联Group2)和shape(关联Group1)的两个图例,关键是让两个美学映射的图例属性对齐,让ggplot将它们合并为一个。以下是可行的实现方案:

方案代码

data <- data.frame(Xdata = rnorm(6),                       
                   Ydata = rnorm(6),
                   Group1 = c("ld-01", "ld-02", "ld-03",
                              "ld-04", "ld-05", "ld-06"),
                   Group2 = c("ld", "ld", "l",
                              "ld4", "l", "ld6"))

# 为Group2的类别定义固定颜色(可选,确保颜色稳定)
color_map <- c("ld" = "#E63946", "l" = "#457B9D", "ld4" = "#1D3557", "ld6" = "#F1FAEE")
# 建立Group1到对应Group2的映射
group1_to_group2 <- setNames(data$Group2, data$Group1)

ggplot(data, aes(Xdata, Ydata, shape = Group1, color = Group1)) +  
  geom_point(size = 7) +
  # 配置颜色:每个Group1使用其对应Group2的颜色
  scale_color_manual(
    values = color_map[group1_to_group2],
    name = "分组",
    labels = paste(names(group1_to_group2), "(", group1_to_group2, ")")
  ) +
  # 配置自定义形状
  scale_shape_manual(
    values = c(16, 17, 15, 18, 19, 20),
    name = "分组"
  )

关键逻辑

  • 我们将color的映射对象改为Group1,但通过group1_to_group2让每个Group1的点使用其对应的Group2颜色,保留原数据的分组颜色逻辑。
  • 让scale_color_manual和scale_shape_manual的name参数完全一致,ggplot会自动识别这是同一个图例,将形状和颜色合并显示。
  • labels参数可以自定义图例显示的文本,这里拼接了Group1和Group2的信息,你可以根据需求改为仅显示Group1(labels = names(group1_to_group2))。

如果不需要固定颜色,也可以去掉color_map,直接使用ggplot默认的颜色分配,只需将scale_color_manual改为:

scale_color_discrete(name = "分组", labels = paste(names(group1_to_group2), "(", group1_to_group2, ")"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:35:34