如何避免在文本注释上绘制 geom_line ?

Sky*_*ker 2 r ggplot2

我有一个图,其中每个点都有点、线和注释。问题是行最终会穿过注释文本,我想找到一个解决方案来避免这种情况,例如如何使注释位于“顶部”?

我的伪 ggplot 是这样的:

# some df
ggplot(df,aes(x=x,y=y)) + geom_line() + geom_point() + 
   annotate('text', ...)
Run Code Online (Sandbox Code Playgroud)

请注意,如果我交换顺序geom_linegeom_point线条将绘制在该点的顶部(当然,当颜色不是黑色或存在透明度时)。但是,该线将直接穿过注释文本。

我该如何解决这个问题?到目前为止,我选择不包含线条,但会很好。

eip*_*i10 5

可能最好的选择是使用geom_label,它将在标签文本下方放置白色背景,覆盖该行(如果放置在 后面geom_line)。这样做的优点是,白色背景的大小将被调整为恰好空白将穿过标签的线条部分。

如果您有单个标签,如annotate下面的代码所示,则可以geom_label单独使用。但是,如果您有多个可能重叠的标签,则需要两次调用,一次调用geom_labelwithcolour="white"来生成空白“标签”,这些标签正好覆盖该行,然后调用geom_text标签本身。geom_label这是因为单独使用时,标签背景会重叠并使重叠标签的文本变得模糊。

library(tidyverse)
theme_set(theme_classic())

ggplot(mtcars[1:20,], aes(wt, mpg)) + 
  geom_line() +
  geom_label(aes(label=round(mpg,2)), colour="white", label.padding=unit(0.05,"lines"), 
             size=3) +
  geom_text(aes(label=round(mpg,2)), size=3) +
  annotate("label", 2.25, 27, label="Label", colour="red", label.size=0)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,label.size=0去掉了标签周围的边框。

在此输入图像描述

另一种选择是在注释下方但在线上方放置一个方形白点标记:

ggplot(mtcars[1:20,], aes(wt, mpg)) + 
  geom_line() +
  geom_point(shape=15, colour="white", size=6) +
  geom_text(aes(label=round(mpg,2)), size=3) +
  annotate("point", 2.25, 27, pch=15, size=7, colour="white") +
  annotate("text", 2.25, 27, label="Label", colour="red")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您还可以使线条不那么突出。下面它们只是引导视线,但不会打扰太多:

ggplot(mtcars[1:20,], aes(wt, mpg)) + 
  geom_line(linetype="11", colour="grey30", size=0.25) +
  geom_text(aes(label=round(mpg,2)), size=3) +
  annotate("text", 2.25, 27, label="Label", colour="red")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述