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

