ggplot2中如何在绘图区域外添加geom_text注释(无需拼接图表)
问题描述
现有两个R数据框:
df <- data.frame(Groesse=c("A", "B", "C", "D"), x=c(0, 1, 30, 25), y=c(0, 90, 85, 20)) df_text <- data.frame(Groesse=c("X", "Y"), x=c(1, 30), y=c(105, 105))
尝试用以下代码在散点图上方(绘图区域外)添加文本注释,但生成的图表缺失了geom_text的内容:
plot <- ggplot(df) + geom_point(aes(x, y)) + geom_text(data = df_text, aes(x, y, label = "Groesse")) + scale_y_continuous(limits = c(0,100), expand = c(0,0)) + coord_cartesian(clip = "off") + theme(plot.margin = unit(c(10, 1, 1, 1), "lines")) plot
需求:无需拼接独立图表,直接在绘图区域外添加指定文本注释。
解决方法
问题根源有两点:
scale_y_continuous(limits = c(0,100))会直接过滤掉y值超出范围的数据,df_text中y=105的点被剔除,无法被绘制;label = "Groesse"是固定输出字符串"Groesse",而非引用df_text中的Groesse列值。
修正后的代码如下:
library(ggplot2) df <- data.frame(Groesse=c("A", "B", "C", "D"), x=c(0, 1, 30, 25), y=c(0, 90, 85, 20)) df_text <- data.frame(Groesse=c("X", "Y"), x=c(1, 30), y=c(105, 105)) plot <- ggplot(df) + geom_point(aes(x, y)) + # 修正label映射,添加vjust调整文本对齐 geom_text(data = df_text, aes(x, y, label = Groesse), vjust = 0) + # 将y轴范围限制移至coord_cartesian,仅控制显示范围而非过滤数据 scale_y_continuous(expand = c(0,0)) + coord_cartesian(ylim = c(0,100), clip = "off") + # 调整顶部边距至合理大小 theme(plot.margin = unit(c(2, 1, 1, 1), "lines")) plot
关键说明:
coord_cartesian(ylim = c(0,100))仅控制绘图区域的显示范围,不会删除y值超出范围的数据,配合clip = "off"即可让文本显示在绘图区域外;label = Groesse正确调用df_text中的列值,输出预期的"X"和"Y";vjust = 0设置文本底部对齐,避免与绘图区域顶部重叠;- 顶部边距调整为2行足够显示文本,无需保留原代码的10行冗余设置。
内容的提问来源于stack exchange,提问作者Servus
相关产品推荐
相关产品推荐

