在 R 中使用 geom_label_repel 将标签放在前面,将引线放在后面

lla*_*nts 5 r ggplot2

这里是新的,对 R 是半新的,所以希望我能正确地提出这个问题。

我有看起来像这样的数据(最后是完整的数据集):

Peak     Length    Height    Class   Label
Peak 16  16.542   1128.60   Class 2  Peak 16
Peak 10  16.592   74909.84  Class 4  Peak 10
Peak 6   16.930   21747.10  Class 2  Peak 6
Peak 9   17.177   98380.79  Class 2  Peak 9
Peak 20  17.235   168036.36 Class 4  Peak 20
Peak 11  17.264   85770.79  Class 5  Peak 11
Run Code Online (Sandbox Code Playgroud)

我正在使用标签制作一个情节geom_label_repel,代码如下:

library(ggplot)
library(ggrepel)

ggplot(data = df, aes(x = Length, y = Height, color = Class)) +
  geom_col()+
  geom_label_repel(aes(label = Label),
                   fill = "white",
                   color = "black",
                   nudge_x = 0.2,
                   force= 2,
                   segment.alpha = 0.5)
Run Code Online (Sandbox Code Playgroud)

结果图很好,但我试图找出一种方法来确保峰值标签最终出现在任何引导线之前。

在此处输入图片说明

也许您可以看到“Peak 17”标签与“Peak 3”的引导线重叠。我已经使用了 nudge_x、nudge_y 和 force 来移动标签,但我的完整数据集有更多的峰值和标签,所以我最终总是得到标签上的领导者。

任何帮助将不胜感激,很高兴我找到了这个网站!

完整数据:

df <- structure(list(Peak = structure(c(8L, 2L, 18L, 21L, 13L, 3L, 
1L, 4L, 14L, 6L, 17L, 16L, 12L, 5L, 7L, 10L, 9L, 15L, 20L, 5L, 
11L, 19L), .Label = c("Peak 1", "Peak 10", "Peak 11", "Peak 12", 
"Peak 13", "Peak 14", "Peak 15", "Peak 16", "Peak 17", "Peak 18", 
"Peak 19", "Peak 2", "Peak 20", "Peak 21", "Peak 3", "Peak 4", 
"Peak 5", "Peak 6", "Peak 7", "Peak 8", "Peak 9"), class = "factor"), 
Length = c(16.542, 16.592, 16.93, 17.177, 17.235, 17.264, 
12.065, 12.33, 12.478, 13.844, 13.848, 14.565, 14.836, 14.903, 
15.425, 15.789, 16.542, 16.592, 16.93, 17.177, 17.235, 17.264
), Height = c(1128.6, 74909.84, 21747.1, 98380.79, 168036.36, 
85770.79, 77156.06, 204716.44, 146063.31, 126574.23, 387495.94, 
407584.38, 103778.66, 134615.45, 166271.98, 35626.38, 8076.28, 
14417.26, 6311.36, 1578.34, 408.42, 2920.28), Class = structure(c(2L, 
4L, 2L, 2L, 4L, 5L, 1L, 3L, 5L, 5L, 2L, 2L, 1L, 5L, 3L, 5L, 
5L, 1L, 3L, 5L, 3L, 3L), .Label = c("Class 1", "Class 2", 
"Class 3", "Class 4", "Class 5"), class = "factor"), Label = structure(c(8L, 
2L, 18L, 21L, 13L, 3L, 1L, 4L, 14L, 6L, 17L, 16L, 12L, 5L, 
7L, 10L, 9L, 15L, 20L, 5L, 11L, 19L), .Label = c("Peak 1", 
"Peak 10", "Peak 11", "Peak 12", "Peak 13", "Peak 14", "Peak 15", 
"Peak 16", "Peak 17", "Peak 18", "Peak 19", "Peak 2", "Peak 20", 
"Peak 21", "Peak 3", "Peak 4", "Peak 5", "Peak 6", "Peak 7", 
"Peak 8", "Peak 9"), class = "factor")), class = "data.frame", row.names = c(NA, 
-22L))
Run Code Online (Sandbox Code Playgroud)

Z.L*_*Lin 3

看看这对你有用吗?

ggplot(data = df,
       aes(x = Length, y = Height, label = Label)) +

  # segment layer (alpha = 1 for segment & 0 for label)
  geom_label_repel(nudge_x = 0.2, force = 2, 
                   segment.alpha = 1, alpha = 0,
                   seed = 555) +

  # barchart layer sandwiched in between
  geom_col(aes(color = Class)) +

  # label layer (alpha = 0 for segment & 1 for label, same seed as before)
  geom_label_repel(nudge_x = 0.2, force = 2, 
                   segment.alpha = 0, alpha = 1,
                   seed = 555)
Run Code Online (Sandbox Code Playgroud)

阴谋