#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)