为什么 geom_text() 多次绘制文本?

swo*_*olf 6 r ggplot2 geom-text

请考虑以下最小示例:

library(ggplot2)
library(ggrepel)
ggplot(mtcars) +
  aes(x = mpg, y = qsec) +
  geom_line() +
  geom_text(x = 20, y = 20, label = "(20,20)")
Run Code Online (Sandbox Code Playgroud)

过度绘制的文本

我想你可以很容易地看到文本“(20,20)”被严重过度绘制(实际上,我不知道这是否是正确的词。我的意思是文本在一个位置绘制了几次)。

如果我使用annotate(),这不会发生:

ggplot(mtcars) +
  aes(x = mpg, y = qsec) +
  geom_line() +
  annotate("text", x = 20, y = 20, label = "(20,20)")
Run Code Online (Sandbox Code Playgroud)

没有过度绘制的文本

“那么,你为什么不使用annotate()呢?” 你可能会问。实际上,我不想使用文本进行注释,而是使用标签。而且我还想使用 {ggrepel} 包来避免过度绘图。但是看看会发生什么,当我尝试这个时:

ggplot(mtcars) +
  aes(x = mpg, y = qsec) +
  geom_line() +
  geom_label_repel(x = 20, y = 20, label = "(20,20)")
Run Code Online (Sandbox Code Playgroud)

许多许多标签

同样,绘制了许多标签,{ggrepel} 在防止它们重叠方面做得很好。但我只想要一个指向特定位置的标签。我真的不明白为什么会发生这种情况。我只为x,ylabel每个提供了一个值。我也尝试data = NULLinherit.aes = F并把该值代入aes()geom_label_repel()没有效果。我怀疑标签的数量与mtcars. 对于我的实际应用程序来说,这真的很糟糕,因为我在相应的数据集中有很多行。

你能在这里帮我一下吗,也许能简单解释一下为什么会发生这种情况以及你的解决方案为什么有效?非常感谢!

小智 9

将“check_overlap = TRUE”添加到 geom_text 以防止过度绘制。

library(ggplot2) 

ggplot(mtcars) +
        aes(x = mpg, y = qsec) +
        geom_line() +
        geom_text(x = 20, y = 20, label = "(20,20)", check_overlap = TRUE)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


PoG*_*bas 4

geom_textgeom_label_repel每行添加一个标签。因此,您可以为注释几何提交单独的数据集。例如:

library(ggplot2)
library(ggrepel)
ggplot(mtcars, aes(mpg, qsec)) +
    geom_line() +
    geom_label_repel(aes(20, 20, label = "(20,20)"), data.frame())
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述