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

如何在geom_point散点图网格顶部添加Gene列文本?

问题描述

我有一个数据框,使用以下ggplot代码绘制了散点图:

ggplot(melted.genes, aes(x=Index.SNP, y=value, fill = variable, color=variable)) +
  theme_bw() +
  geom_point(shape=21, size=12) +
  scale_fill_manual(values = c("cyan4", 'yellow'))+
  scale_color_manual(values = c("black","black")) +
  ylab("Probability") +
  geom_hline(yintercept=0.5, color="red", linetype='dashed')+
  theme(text=element_text(size=23),axis.text.x = element_text(angle = 45, hjust = 1)) 

绘图效果为:x轴为Index.SNP,y轴为概率值,每个SNP对应两个不同填充色的散点,图中有一条y=0.5的红色虚线。

我希望将数据框中的Gene列文本添加到绘图的最顶部,请问该如何实现?

数据框的dput输出如下:

> dput(melted.genes)
structure(list(Index.SNP = c("rs6461561", "rs9926049", "rs6479487", 
"rs7432375", "rs2304205", "rs144821294", "rs35045093", "rs10777187", 
"rs61786047", "rs11062162", "rs2224086", "rs6461561", "rs9926049", 
"rs6479487", "rs7432375", "rs2304205", "rs144821294", "rs35045093", 
"rs107771865", "rs61786047", "rs11062162", "rs2224086"), Gene = c("SP4", 
"GRIN2A", "FAM120A", "STAG1", "SCAF1", "AP3D1", "PAX4", "ATP2B1", 
"GMEB1", "CACNA1C", "CSDE1", "SP4", "GRIN2A", "FAM120A", "STAG1", 
"SCAF1", "AP3D1", "PAX4", "ATP2B1", "GMEB1", "CACNA1C", "CSDE1"
), variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("PANs.Score.Proportion", 
"MAGMA.Score.Proportion"), class = "factor"), value = c(1, 1, 
1, 0.76, 0.08, 0.96, 0, 0.98, 0, 1, 0.98, 0.92, 1, 0.35, 0.19, 
0.18, 0.21, 0.17, 0.14, 0.1, 1, 0.26)), row.names = c(NA, -22L
), class = "data.frame")

解决方案

可以通过整理唯一的SNP-Gene映射关系,再用geom_text将文本定位到每个SNP的顶部,同时扩展y轴范围避免文本被裁剪,具体代码如下:

library(ggplot2)
library(dplyr)

# 提取每个SNP对应的唯一Gene标签,避免重复绘制
gene_labels <- melted.genes %>% 
  distinct(Index.SNP, Gene)

ggplot(melted.genes, aes(x=Index.SNP, y=value, fill = variable, color=variable)) +
  theme_bw() +
  geom_point(shape=21, size=12) +
  # 添加Gene文本到散点顶部
  geom_text(data = gene_labels, aes(x=Index.SNP, y=1.1, label=Gene), 
            size=7, color="black", inherit.aes=FALSE) +
  scale_fill_manual(values = c("cyan4", 'yellow'))+
  scale_color_manual(values = c("black","black")) +
  ylab("Probability") +
  geom_hline(yintercept=0.5, color="red", linetype='dashed')+
  # 扩展y轴上限,确保顶部文本完整显示
  ylim(0, 1.2) +
  theme(text=element_text(size=23),
        axis.text.x = element_text(angle = 45, hjust = 1))

关键说明

  • distinct(Index.SNP, Gene):去除数据框中重复的SNP-Gene记录,每个SNP仅保留一条Gene标签,避免同一位置重复绘制文本。
  • geom_text参数:y=1.1将文本定位在散点上方(数据最大y值为1,1.1的位置足够避开散点);inherit.aes=FALSE避免继承原图层的颜色映射,防止文本被错误着色。
  • ylim(0, 1.2):扩展y轴范围,确保顶部的Gene文本不会被绘图边界裁剪。

你可以根据需求调整文本的size、color以及y轴的位置参数,优化显示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:07:03