如何将 geom_sina 点的位置与 geom_text_repel 对齐

How to align position of geom_sina point with geom_text_repel

一旦 geom_violin 中的点通过 geom_sina 分布,然后通过 geom_label_repel 甚至 geom_label 标记,该线指向 x 轴的中线类别。 有没有办法让 geom_label_repel 甚至 geom_label 知道点在 geom_sina 之后的位置?

示例:

library(dplyr)
library(ggforce)
library(ggplot2)
library(ggrepel)

ggplot(midwest, aes(state, area)) +
  geom_violin() +
  geom_sina() +
  geom_label_repel(box.padding = 0.5, min.segment.length = 0.5, aes(label = county), data=midwest %>% subset(poptotal>1000000), size=3)

您可以看到标签中的线如何始终到达中线,而不是点(请参阅密歇根州的 WAYNE 和 OAKLAND 县)。

对于这类问题,我还没有看到满意的答案。我见过的一般方法是使用映射转换创建绘图,然后提取转换后的值,然后使用这些转换后的值绘制图层。

编辑:在每轮绘图前添加set.seed

library(tidyverse)
set.seed(0)
a <- ggplot(midwest, aes(state, area)) +
  geom_violin() +
  geom_sina()
  
a_guts <- ggplot_build(a)$data[[2]] %>% 
  bind_cols(midwest %>% 
              mutate(state_num = as.integer(as.factor(state))) %>%
              select(state_num, area, county, poptotal)) %>% 
  subset(poptotal>1E6)


set.seed(0)
a + geom_point(data = a_guts, aes(x = x, y = y), 
               size = 3, color = "red", shape = 22, fill = NA) +
  geom_label_repel(data = a_guts,
                   aes(x = x, y = y, label = county), color = "red",
                   box.padding = 2, min.segment.length = 0.5, size=3)