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

如何在R的ggscatter散点图图例中显示特定基因名称

在ggscatter散点图中添加特定基因图例并调整位置

问题描述

我使用ggscatter绘制散点图,已生成基础图例,但不知道如何在图例中显示特定基因(如Hjurp、Cdc25c、Vsig4)的名称,也不清楚如何调整图例位置,希望制作出类似示例图的图例样式。

当前代码

ggscatter(data_frame_merge, x = "log10TPM", y = "logFC", color = "Group", palette = c("#00AFBB", "#BBBBBB", "#FC4E07"), title = "M0 vs TAMEM_9")+
  theme(plot.title = element_text(hjust = 0.5), legend.position="right")+ 
  xlab(bquote(log[10](TPM)))+ 
  ylab(bquote(log[2](FC)))+ 
  scale_x_continuous(limits = c(0,5))+
  scale_y_continuous(limits = c(-15,15),breaks = get_breaks(by = 2.5, from = -15))+
  coord_cartesian(expand = F)+
  rremove("ticks") + geom_point(data = data_frame_merge %>% filter(gene_name == "Hjurp"),color = "red",size = 3) +
  geom_point(data = data_frame_merge %>% filter(gene_name == "Cdc25c"), color = "blue",size = 3) +
  geom_point(data = data_frame_merge %>% filter(gene_name == "Vsig4"), color = "green", size = 3)

数据结构示例

dput(head(data_frame_merge))
structure(list(X = c(1L, 2L, 4L, 5L, 6L, 7L), gene_name = c("Gnai3", 
"Pbsn", "H19", "Scml2", "Apoh", "Narf"), M0_TPM = c(63.08, 0, 
0.24, 0.32, 0, 8.96), TAMEM = c(60.36, 0, 0.07, 1.14, 0, 16.6
), TAMEM_9_TPM = c(58.17, 0, 0.99, 0.02, 0, 15.83), TAMEM_C_5.x = c(71.45, 
0, 0.38, 0.4, 0.31, 9.63), M0 = c(3760, 0, 9, 6, 0, 737), TAMEM_9 = c(3213, 
0, 14, 2, 0, 1205), logFC = c(0.008986276, 0, 0.863500696, -1.300783986, 
0, 0.94496773), logCPM = c(7.036410655, -3.732344581, -0.965343021, 
-2.154956244, -3.732344581, 5.230839035), PValue = c(0.966983348, 
1, 0.235318227, 0.298737053, 1, 1.32e-05), Signifi = c(0L, 0L, 
0L, 0L, 0L, 1L), log10TPM = c(1.789756932, 0, 0.208172527, 0.068185862, 
0, 1.126942718), Group = c("noSig", "noSig", "noSig", "noSig", 
"noSig", "noSig")), row.names = c("ENSMUSG00000000001", "ENSMUSG00000000003", 
"ENSMUSG00000000031", "ENSMUSG00000000037", "ENSMUSG00000000049", 
"ENSMUSG00000000056"), class = "data.frame")

解决方案

核心思路

关键是要将高亮基因的颜色映射到aes()中,这样ggplot才会自动生成对应的图例项,而不是直接在geom_point()里指定固定颜色(这种方式不会生成图例)。下面提供两种常用方案:


方案1:合并Group与基因图例

先给数据框添加标记列,将目标基因单独标记,再通过统一的颜色映射生成图例:

library(ggplot2)
library(ggpubr)
library(dplyr)

# 1. 标记目标高亮基因
data_frame_merge <- data_frame_merge %>%
  mutate(gene_highlight = case_when(
    gene_name == "Hjurp" ~ "Hjurp",
    gene_name == "Cdc25c" ~ "Cdc25c",
    gene_name == "Vsig4" ~ "Vsig4",
    TRUE ~ Group  # 非目标基因沿用原Group分类
  ))

# 2. 绘制散点图
ggscatter(data_frame_merge, 
          x = "log10TPM", 
          y = "logFC", 
          color = "gene_highlight",  # 用新列映射颜色
          title = "M0 vs TAMEM_9") +
  # 手动指定所有分类的颜色
  scale_color_manual(values = c(
    "noSig" = "#BBBBBB",  # 原Group的noSig颜色
    # 如果有其他Group分类,补充对应的原palette颜色
    "#00AFBB" = "#00AFBB",
    "#FC4E07" = "#FC4E07",
    "Hjurp" = "red",
    "Cdc25c" = "blue",
    "Vsig4" = "green"
  )) +
  theme(plot.title = element_text(hjust = 0.5),
        # 调整图例位置:可选"right"/"left"/"top"/"bottom",或用坐标c(x,y)自定义(x,y范围0-1)
        legend.position = "bottom",
        # 图例横向排列(可选)
        legend.direction = "horizontal") +
  xlab(bquote(log[10](TPM))) +
  ylab(bquote(log[2](FC))) +
  scale_x_continuous(limits = c(0,5)) +
  scale_y_continuous(limits = c(-15,15), breaks = get_breaks(by = 2.5, from = -15)) +
  coord_cartesian(expand = F) +
  rremove("ticks")

方案2:独立的基因图例(推荐)

使用ggnewscale包添加独立的颜色比例尺,将Group图例和高亮基因图例分开显示,更清晰:

library(ggplot2)
library(ggpubr)
library(dplyr)
library(ggnewscale)

# 1. 绘制基础散点图(保留原Group图例)
ggscatter(data_frame_merge, 
          x = "log10TPM", 
          y = "logFC", 
          color = "Group", 
          palette = c("#00AFBB", "#BBBBBB", "#FC4E07"), 
          title = "M0 vs TAMEM_9") +
  theme(plot.title = element_text(hjust = 0.5),
        # 自定义图例位置,比如放在右上角
        legend.position = c(0.9, 0.8)) +
  xlab(bquote(log[10](TPM))) +
  ylab(bquote(log[2](FC))) +
  scale_x_continuous(limits = c(0,5)) +
  scale_y_continuous(limits = c(-15,15), breaks = get_breaks(by = 2.5, from = -15)) +
  coord_cartesian(expand = F) +
  rremove("ticks") +
  # 2. 添加新的颜色比例尺,用于高亮基因
  new_scale_color() +
  # 绘制高亮基因的点,映射gene_name到颜色以生成图例
  geom_point(aes(color = gene_name), 
             data = data_frame_merge %>% filter(gene_name %in% c("Hjurp", "Cdc25c", "Vsig4")),
             size = 3) +
  # 定义高亮基因的颜色和图例名称
  scale_color_manual(name = "关键基因",
                     values = c("Hjurp" = "red", "Cdc25c" = "blue", "Vsig4" = "green"))

图例位置调整说明

  • 内置位置:直接设置legend.position = "right"/"left"/"top"/"bottom"
  • 自定义位置:用数值向量c(x, y),其中x和y的范围是0-1(0对应左/下,1对应右/上),比如c(0.9, 0.8)表示右上角区域

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:27:00