如何在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
相关产品推荐
相关产品推荐

