R语言 使用组美学以外的因子避开geom_line()

ckocjqey  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(93)

我尝试使用dodged geom_line()来创建一个图形,但是我需要使用一个与aes(group)因子不同的因子来进行dodge。
这是我的问题的一个演练。
首先,生成一些数据:

require(tidyverse)

treatment <- c(rep("t1", 15),
               rep("t2", 15))
sample <- c(rep("a", 5),
            rep("b", 5),
            rep("c", 5),
            rep("d", 5),
            rep("e", 5),
            rep("f", 5))

depth <- rep(1:5, 6)
set.seed(112)
values <- rnorm(30)
df <- tibble(treatment, sample, depth, values)

数据的初始绘图:

ggplot(df, aes(x = depth, y = values, color = treatment)) +
  geom_point() +
  geom_line()

这会生成一个带有无意义线条的图:

因此,我指定使用group美学:

ggplot(df, aes(x = depth, y = values, color = treatment)) +
  geom_point() +
  geom_line(aes(group = sample))

这会产生更好的图形。

然而,我的真实案例包含了更多的数据,治疗方法也有重叠。我希望避开处理以更好地显示每个处理的值:

ggplot(df, aes(x = depth, y = values, color = treatment)) +
  geom_point(position = position_dodge(width = 0.5)) +
  geom_line(aes(group = sample), position = position_dodge(width = 0.5))


这会基于之前指定的color美学来避开geom_point(),但会使用其group美学(已设置为group = sample)来避开geom_line()
从本质上讲,问题是position_dodge()似乎优先使用group的美学,我没有找到任何方法来避开线条而不更改为geom_path()。这允许我不指定group美学来获得第二个图,但我更喜欢不使用,因为它需要 Dataframe 完全有序(我还没有设法使用我的真实世界数据集使其发挥作用)。
有没有geom_line()解决方案?

6kkfgxo0

6kkfgxo01#

让每个color都是自己的geom_path层,然后手动position_nudge这些geom_path层中的每个层,以与geom_point层的position_dodge匹配。

library(tidyverse)
set.seed(112)
DODGE_WIDTH <- .5

treatment <- c(rep("t1", 15), rep("t2", 15))
sample <- c(
  rep("a", 5), rep("b", 5), rep("c", 5), rep("d", 5), rep("e", 5), rep("f", 5))
depth <- rep(1:5, 6)

values <- rnorm(30)
tb <- tibble(treatment, sample, depth, values)

ggplot(tb, aes(x=depth, y=values, color=treatment)) +
  geom_point(position=position_dodge(width=DODGE_WIDTH)) +
  geom_line(
    data=filter(tb, treatment=="t1"),
    aes(group=sample), position=position_nudge(x=-DODGE_WIDTH/4)) +
  geom_line(
    data=filter(tb, treatment=="t2"),
    aes(group=sample), position=position_nudge(x=DODGE_WIDTH/4))
lmyy7pcs

lmyy7pcs2#

group = sample移动到主ggplot似乎可以做到这一点:

require(tidyverse)
#> Loading required package: tidyverse

treatment <- c(rep("t1", 15),
               rep("t2", 15))
sample <- c(rep("a", 5),
            rep("b", 5),
            rep("c", 5),
            rep("d", 5),
            rep("e", 5),
            rep("f", 5))

depth <- rep(1:5, 6)
set.seed(112)
values <- rnorm(30)
df <- tibble(treatment, sample, depth, values)

ggplot(df, aes(x = depth, y = values, color = treatment, group = sample)) +
  geom_point(position = position_dodge(width = 0.5)) +
  geom_line(position = position_dodge(width = 0.5))

创建于2019-11-20由reprex package(v0.3.0)

相关问题