如何用ggplot2仅为散点图中group列值为TRUE的点添加标签?
问题需求
使用ggplot2绘制散点图,仅为**group列值为TRUE**(即残差大于2*sd(residuals))的点添加Symbol标签,当前代码给所有点都添加了标签,导致图面杂乱。
数据集
structure(list(Symbol = c("CTD-2326C4.1", "RP11-541M12.6", "RP11-568J23.2", "CTC-312O10.3", "AC002044.3", "RP11-49K24.3", "MIR4697HG", "RP11-630A13.4", "RP11-1110F20.1", "RP11-80P20.3", "DBNDD1", "SARM1", "ACSM3", "COPZ2", "PRKAR2B"), Inter_good = c(-1.58939474887221, 1.69067143806302, 1.16272382521224, 2.20145652526691, -1.57068808916146, 1.08473475381231, -1.5565760616485, 1.07719138691427, 2.59625182296151, 1.40402170916536, -1.52458643228586, 1.02335885723362, -1.12350765154002, 1.53586139998766, 1.82352949605315), Poor_good = c(-1.87518197493689, 1.81130441059405, 1.79808591248711, 1.39949394735816, -2.06718610513002, 1.20799300027021, -1.19642510052193, 1.65505108315884, 1.85022430533524, 1.3007385250318, -1.35755750794873, 1.26178439956468, -1.89762330533538, 1.06381047498678, 1.65314202569446), residuals = c(0.240887793186567, 0.21643114843019, 0.299667558924424, 1.09635826839287, 0.431704686232931, 0.151295682884655, 0.334723160744862, 0.256985266497353, 1.08712419961056, 0.387446645842676, 0.158296345514071, 0.0417018116472507, 0.726891033892134, 0.731665840876596, 0.491064099192696), group = c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)), row.names = c(1214L, 1215L, 1216L, 1217L, 1218L, 1219L, 1220L, 1221L, 1222L, 1223L, 1L, 2L, 3L, 4L, 5L), class = "data.frame")
数据生成代码
regres_data$residuals = abs(lm(Inter_good~Poor_good,data=regres_data)$residuals) regres_data$group = regres_data$residuals > 2*sd(regres_data$residuals)
当前问题代码
ggplot(regres_data1, aes(x= Inter_good, y= Poor_good))+ geom_point(aes(colour = group), size=.9) + geom_text_repel(aes(label=Symbol),hjust=0, vjust=0) + geom_smooth(method=lm, se=FALSE, size=0.1) + theme(legend.position="bottom", legend.title=element_blank())
解决方案
有两种简单方式实现仅为group=TRUE的点添加标签:
方法1:筛选数据子集传给geom_text_repel
直接在geom_text_repel中通过data参数指定只使用group == TRUE的数据行,仅符合条件的点会生成标签:
ggplot(regres_data1, aes(x= Inter_good, y= Poor_good))+ geom_point(aes(colour = group), size=.9) + # 仅筛选group为TRUE的子集添加标签 geom_text_repel(data = subset(regres_data1, group == TRUE), aes(label=Symbol), hjust=0, vjust=0) + geom_smooth(method=lm, se=FALSE, size=0.1) + theme(legend.position="bottom", legend.title=element_blank())
方法2:用ifelse控制标签内容
在aes(label=...)中使用ifelse函数,仅当group=TRUE时显示Symbol,否则标签为空字符串(空标签不会被绘制):
ggplot(regres_data1, aes(x= Inter_good, y= Poor_good))+ geom_point(aes(colour = group), size=.9) + # 仅当group为TRUE时显示标签,否则为空 geom_text_repel(aes(label=ifelse(group, Symbol, "")), hjust=0, vjust=0) + geom_smooth(method=lm, se=FALSE, size=0.1) + theme(legend.position="bottom", legend.title=element_blank())
两种方法都能实现需求,方法1更高效(仅处理需要标签的行),方法2写法更简洁。
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

