请考虑以下最小示例:
library(ggplot2)
library(ggrepel)
ggplot(mtcars) +
aes(x = mpg, y = qsec) +
geom_line() +
geom_text(x = 20, y = 20, label = "(20,20)")
我想您可以很容易地看到文本((20,20))过度绘制(实际上,我不知道这是不是正确的词。我的意思是该文本在一个位置多次绘制)
如果我使用annotate()
,则不会发生:
ggplot(mtcars) +
aes(x = mpg, y = qsec) +
geom_line() +
annotate("text", x = 20, y = 20, label = "(20,20)")
“那么,为什么不使用annotate()
?”你可能会问。实际上,我不想使用文本作为注释,而是使用标签。而且我还想使用{ggrepel}包来避免过度绘图。但是看看当我尝试这样做时会发生什么:
ggplot(mtcars) +
aes(x = mpg, y = qsec) +
geom_line() +
geom_label_repel(x = 20, y = 20, label = "(20,20)")
同样,绘制了许多标签,{ggrepel}在防止标签重叠方面做得很好。但我只希望一个标签指向特定位置。我真的不明白为什么会这样。我仅为x
,y
和label
提供了一个值。我还尝试了data = NULL
和inherit.aes = F
并将这些值放入aes()
中的geom_label_repel()
中无效。我怀疑标签的数量与mtcars
中的行数一样。对于我的实际应用程序,这真的很糟糕,因为在相应的数据集中有很多行。
您能否在这里帮助我,并简要说明为什么会发生这种情况以及您的解决方案为何起作用?非常感谢!
答案 0 :(得分:2)
geom_text
或geom_label_repel
每行添加一个标签。因此,您可以为注释几何提交单独的数据集。例如:
library(ggplot2)
library(ggrepel)
ggplot(mtcars, aes(mpg, qsec)) +
geom_line() +
geom_label_repel(aes(20, 20, label = "(20,20)"), data.frame())
答案 1 :(得分:2)