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

如何为包含两个geom_point散点图的ggplot添加图例?

如何为包含两个geom_point散点图的ggplot添加图例?

嘿,Assa!问题出在你设置颜色的方式上——你现在是直接把color参数写在aes()外面,相当于给整组点硬指定颜色,ggplot根本不会把这种固定颜色当成“需要生成图例的映射变量”。想要图例,得把颜色放到aes()里面做映射,再用scale_color_manual()来绑定你想要的颜色值。

我分两种情况给你改代码,先从你最后贴的简化版开始,再处理你原来带ifelse高亮基因的复杂版本:

一、简化版:给两个基础点组加图例

你原来的简化代码没有图例,是因为color不在映射里。修改成这样:

ggplot(data=combined_dataset) +
  # 把color放进aes,手动给这组点起个名字(比如"BJAB")
  geom_point(mapping = aes(x = rf_bjab_prot, y = rf_bjab_trans, color = "BJAB"), 
             alpha=0.7, size = 3) +
  # 另一组点同理,起个名字"MIA PaCa"
  geom_point(mapping = aes(x = rf_miapaca_prot, y = rf_miapaca_trans, color = "MIA PaCa"), 
             alpha=0.2, size = 3) +
  # 用scale_color_manual把名字和你要的颜色绑定,还能自定义图例标题
  scale_color_manual(name = "细胞系", 
                     values = c("BJAB" = "blue1", "MIA PaCa" = "#D55E00"))

这样ggplot就会识别到color是一个分类映射,自动生成对应的图例啦。

二、复杂版:带目标基因高亮的图例

你原来的代码里有ifelse判断特定基因(EGFR、REL这些)的颜色,这时候我们可以先给数据集加两个标记列,区分每个点组里的目标基因和普通基因,再基于这些列做颜色映射:

第一步,先给数据加标记列(用dplyr的话更方便):

library(dplyr)

combined_dataset <- combined_dataset %>%
  mutate(
    # 标记BJAB组的点是否是目标基因
    bjab_group = ifelse(name.miapaca %in% genes, "BJAB-目标基因", "BJAB-其他基因"),
    # 标记MIA PaCa组的点是否是目标基因
    miapaca_group = ifelse(name.miapaca %in% genes, "MIA PaCa-目标基因", "MIA PaCa-其他基因")
  )

第二步,修改ggplot代码,把颜色映射到新的标记列,再指定对应颜色:

ggplot(data=combined_dataset) +
  # BJAB组的点,颜色映射到bjab_group
  geom_point(mapping = aes(x = rf_bjab_prot, y = rf_bjab_trans, color = bjab_group), 
             alpha=0.7, size = 3) +
  # MIA PaCa组的点,颜色映射到miapaca_group
  geom_point(mapping = aes(x = rf_miapaca_prot, y = rf_miapaca_trans, color = miapaca_group), 
             alpha=0.2, size = 3) +
  # 你的文本注释部分保持不变(这些是固定颜色的标注,不需要进图例)
  geom_text_repel(mapping = aes(x = rf_bjab_prot, y = rf_bjab_trans, 
                               label = ifelse(name.miapaca %in% genes, name.miapaca, "")), 
                  size = 3, box.padding = 1, color = "darkblue") + 
  geom_text_repel(mapping = aes(x = rf_miapaca_prot, y = rf_miapaca_trans,
                                label = ifelse(rf_miapaca_prot >= 0.05 & rf_miapaca_trans >= 60, name.miapaca, "")),
                  size = 3, box.padding = 1, color = "green") +
  geom_text_repel(mapping = aes(x = rf_bjab_prot, y = rf_bjab_trans, 
                                label = ifelse(rf_bjab_prot <= -0.5 & rf_bjab_trans <= -10, name.miapaca, '')),
                  size = 3, box.padding = 1, color = "#009E73") +
  # 手动绑定每个分组对应的颜色,自定义图例标题
  scale_color_manual(name = "点类型",
                     values = c(
                       "BJAB-目标基因" = "blue1",
                       "BJAB-其他基因" = "maroon",
                       "MIA PaCa-目标基因" = "#D55E00",
                       "MIA PaCa-其他基因" = "skyblue"
                     ))

这样修改后,图例就会显示出四个类别,对应你设置的不同颜色啦。

核心逻辑就是:只有当颜色是aes()里的映射变量(不管是数据原有的列,还是你手动创建的分类标记),ggplot才会生成图例,之前直接在外面赋值颜色,相当于告诉ggplot“这些点都是一个颜色,不用做区分”,自然就不会有图例了。

备注:内容来源于stack exchange,提问作者Assa Yeroslaviz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 11:59:32