如何将position_dodge()和geom_line()与重叠分组结合起来?

2023-12-07

当 x 轴上的分组变量、颜色和线条重叠但总是不同时,是否可以使用 geom_line() 在躲避点之间绘制一条线?

下图中的灰线应该始终连接两个具有相同名称的数据点,它们位于相同的分组 2(x 轴)内,但位于不同的分组 2(颜色)中。

可重现的例子:

library(tidyverse)

tbl = tibble(name = rep(paste("name", 1:12), each = 2), 
             grouping1 = rep(c("A", "B"), 12),
             grouping2 = c(rep("X", 8), rep("Y",8), rep("Z",8)),
             value = 1:24)

enter image description here

tbl %>%
  ggplot(aes(x = grouping2, y = value, color = grouping1)) +
    geom_line(aes(group = name),position= position_dodge(0.5), color = "grey44") +
    geom_point(position = position_dodge(0.5)) 

enter image description here

对于我的具体示例,有一些或多或少的黑客方法可以解决这个问题,例如使用 geom_segment() 作为线条并将 x 轴 grouping2 转换为数字或组合 x 轴上的两个分组(如 grouping1 和 grouping2)。

因此,我的问题是是否有一个clean怎样才能达到想要的剧情?

有一些相关的问题,例如将position_dodge与geom_line结合使用,但它们并不完全相同。


实现所需结果的一种选择是将 x 轴变量转换为数字并手动调整位置,而不是使用position_dodge:

library(tidyverse)

tbl = tibble(name = rep(paste("name", 1:12), each = 2), 
             grouping1 = rep(c("A", "B"), 12),
             grouping2 = c(rep("X", 8), rep("Y",8), rep("Z",8)),
             value = 1:24)

width <- .125

tbl1 <- tbl %>%
  mutate(grouping2 = factor(grouping2),
         x = as.numeric(grouping2) + width * if_else(grouping1 == "A", -1, 1))

breaks <- unique(as.numeric(tbl1$grouping2))
labels <- unique(tbl1$grouping2)

ggplot(tbl1, aes(x = x, y = value, color = grouping1)) +
  geom_line(aes(group = name), color = "grey44") +
  geom_point() +
  scale_x_continuous(breaks = breaks, labels = labels)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将position_dodge()和geom_line()与重叠分组结合起来? 的相关文章

随机推荐