如何仅调整ggplot2中geom_segment的x坐标 保持xend不变避免箭头重叠
解决方案
ggplot的分类x轴本质是按因子水平顺序对应1、2、3……的整数坐标,不需要用position_nudge调整位置,直接手动给箭头的起始x坐标加偏移即可,不会影响xend的固定位置。
你可以直接修改geom_segment中的x参数取值,示例修正代码如下:
library(tidyverse) demoData <- tribble( ~priming, ~rt, "control", 374, "phonological", 267, "orthographic", 304 ) |> mutate( diff.from.baseline = rt - first(rt) ) baseline <- demoData |> filter(priming == "control") |> dplyr::select(rt) |> pull() # 提前定义各分类对应的x轴数值,方便后续修改 x_control <- 1 x_ortho <- 3 x_phono <- 2 demoData |> ggplot( aes( x = priming, y = rt ) ) + geom_col() + #### 从control指向orthographic的箭头 geom_segment( aes( x = x_control + 0.15, # 起始x向右偏移0.15 y = baseline, xend = x_control + 0.15, # 竖段x保持一致 yend = baseline + 50 ) ) + geom_segment( aes( x = x_control + 0.15, # 和竖段上端x对齐 y = baseline + 50, xend = x_ortho, # xend固定为目标柱子位置,不偏移 yend = baseline + 50 ) ) + geom_segment( aes( x = x_ortho, y = baseline + 50, xend = x_ortho, yend = demoData |> filter(priming == "orthographic") |> dplyr::select(rt) |> pull() ), arrow = arrow() ) + #### 从control指向phonological的箭头 geom_segment( aes( x = x_control - 0.15, # 起始x向左偏移0.15,和另一个竖段错开 y = baseline, xend = x_control - 0.15, yend = baseline + 100 ) ) + geom_segment( aes( x = x_control - 0.15, # 和竖段上端x对齐 y = baseline + 100, xend = x_phono, # xend固定不偏移 yend = baseline + 100 ) ) + geom_segment( aes( x = x_phono, y = baseline + 100, xend = x_phono, yend = demoData |> filter(priming == "phonological") |> dplyr::select(rt) |> pull() ), arrow = arrow() )
你可以根据自己的需求调整偏移量0.15的大小,控制两个竖段的间距。
内容的提问来源于stack exchange,提问作者Carlos Luis Rivera
相关产品推荐
相关产品推荐

