向ggplot传入完整数据集时如何使用geom_label_repel?
问题原因
当你把mtcars设为ggplot()的全局数据集时,geom_label_repel()会默认继承这个数据集——mtcars有32行数据,所以它会为每一行都绘制一次相同的标签,最终导致32个标签重叠在一起。
可行解决方案
方案1:给geom_label_repel()传入单行数据集
直接构造只包含目标坐标的单行数据,让图层只绘制一次标签:
library(tidyverse) library(ggrepel) ggplot(data = mtcars) + geom_point(aes(x = wt, y = mpg)) + geom_label_repel( data = tibble(x = 2.5, y = 23.92395), # 构造单行数据集 aes(x = x, y = y), color = "red", label = "My car prediction" )
方案2:使用annotate_repel()(推荐)
ggrepel包提供了annotate_repel()函数,专门用于添加单个注释,不会继承全局数据集,用法更简洁:
library(tidyverse) library(ggrepel) ggplot(data = mtcars) + geom_point(aes(x = wt, y = mpg)) + annotate_repel( geom = "label", x = 2.5, y = 23.92395, color = "red", label = "My car prediction" )
补充说明
你尝试的data = NULL无效,是因为当图层设置data = NULL时,ggplot仍会自动继承ggplot()中的全局数据集,所以必须明确传入一个行数为1的数据集,或者使用annotate_repel()这类不依赖图层数据的注释函数。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

