Слегка измените только положение x в сегменте geom_segment, но сохраняйте положение xend постоянным

#r #ggplot2 #geom-col #geom-segment

#r #ggplot2 #геометрия #геомагнитный сегмент

Вопрос:

Я хочу нарисовать столбчатую диаграмму с тремя столбцами, где две стрелки начинаются от одного столбца к двум другим столбцам, и эти стрелки не перекрывают друг друга, как показано ниже.

введите описание изображения здесь

Мне удалось создать диаграмму, и я использовал geom_segment s для рисования стрелок. Однако стрелки перекрываются, когда они начинаются от столбца control .

введите описание изображения здесь

Я думал, что смогу решить эту проблему, установив geom_segment(..., position = position_nudge(x = 0.25)) . Однако это меняет не только положение x , но и xend . Тогда, как я должен слегка изменить geom_segment положение x только, сохраняя положение xend постоянным?

введите описание изображения здесь

МВЕ

 library(tidyverse)  demoData lt;- tribble(  ~priming, ~rt,  "control", 374,  "phonological", 267,  "orthographic", 304 ) |gt; mutate(  diff.from.baseline = rt - first(rt) )   baseline lt;- demoData |gt;  filter(priming == "control") |gt;  dplyr::select(rt) |gt;  pull()  demoData |gt;  ggplot(  aes(  x = priming,  y = rt  )  )    geom_col()    #### from control to orthographic  geom_segment(  aes(  x = "control",  y = baseline,  xend = "control",  yend = baseline   50  )#,  #position = position_dodge2(  # width = 0.5,  # preserve = "total"  # )  #position = position_nudge(  # x = 0.25,  # xend = 0  #)  )    geom_segment(  aes(  x = "control"   0.25,  y = baseline   50,  xend = "orthographic",  yend = baseline   50  )#,  #position = position_dodge2(  # width = 1,  # preserve = "total"  # )  #position = position_nudge(  # x = 0.25,  # xend = 0  #)  )    geom_segment(  aes(  x = "orthographic",  y = baseline   50,  xend = "orthographic",  yend = demoData |gt;  filter(priming == "orthographic") |gt;  dplyr::select(rt) |gt;  pull()  ),  arrow = arrow()  )    #### from control to phonological  geom_segment(  aes(  x = "control",  y = baseline,  xend = "control",  yend = baseline   100  )  )    geom_segment(  aes(  x = "control",  y = baseline   100,  xend = "phonological",  yend = baseline   100  )  )    geom_segment(  aes(  x = "phonological",  y = baseline   100,  xend = "phonological",  yend = demoData |gt;  filter(priming == "phonological") |gt;  dplyr::select(rt) |gt;  pull()  ),  arrow = arrow()  )  

Комментарии:

1. Вы хотите, чтобы порядок был таким же алфавитным или в порядке появления?

Ответ №1:

Вот такой подход:

 segments lt;- data.frame(seg = rep(c(1:2), each = 4),  x = c(0.8, 0.8, 3, 3, 1.2, 1.2, 2, 2),  y = c(as.numeric(demoData[1,2]), 450,   450, as.numeric(demoData[3,2]),  as.numeric(demoData[1,2]), 425,   425, as.numeric(demoData[2,2])))  ggplot()    geom_path(data = segments, aes(x, y, group = seg), arrow = arrow())    geom_col(data = demoData,   aes(x = as.numeric(factor(demoData$priming,   levels = demoData$priming)), rt))    scale_x_continuous(breaks = 1:3, labels = demoData$priming)  

введите описание изображения здесь