在 R 中绘制 geom_line 和 geom_ribbon 时如何添加不连续性?

Giu*_*tri 3 r ggplot2

我有一个数据集,其中 X 值是从 1 到千分之几的整数,并且想要绘制平均值 Y 以及围绕该平均值的离散度度量。我遇到的问题是缺少一些 X 值。因此,当使用 geom_line 和 geom_ribbon 函数时,绘图是连续的,我找不到办法让它在没有数据的地方留下空白。

这是一个可重现的模型示例。

data.1 <-read.csv(text = "
Treatment, X, Y_value
A,1,120.5
B,1,123.6
C,1,100.4
A,2,120.9
B,2,123.9
C,2,101.0
A,3,122.3
B,3,126.6
C,3,102.3
A,6,124.8
B,6,128.0
C,6,105.5
A,7,129.5
B,7,129.4
C,7,108.9
A,8,132.9
B,8,130.6
C,8,113.9
A,9,137.6
B,9,136.0
C,9,115.3
A,10,138.4
B,10,139.6
C,10,118.9
A,11,143.9
B,11,145.9
C,11,126.6
")

data.1 <- data.1 %>% group_by(X) %>% summarise(mean.y = mean(Y_value),
                                                  sd.y = sd(Y_value))

library(ggplot2)
ggplot(data.1, aes(X, mean.y)) +
        geom_line(color="red") +
        geom_ribbon(aes(ymin=mean.y-sd.y, ymax=mean.y+sd.y), alpha=0.4) +
        scale_x_continuous(limits=c(0,11), breaks = c(seq(min(0),max(11), length.out = 12)))+
        theme_bw() +
        theme(panel.grid.minor = element_blank(),
              panel.grid.major = element_blank())
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

在此输入图像描述

这就是我想要得到的:

在此输入图像描述

任何有关如何实现这一目标的提示将不胜感激。

谢谢

eip*_*i10 6

您可以添加分组列来标记X截止值之上和之下的值。在本例中,我已对标准进行了硬编码,但一般来说,如果您有不连续性所在位置的标准,则可以通过编程方式执行此操作。

例如:

ggplot(data.1, aes(X, mean.y, group=X<5)) +
  geom_line(color="red") +
  geom_ribbon(aes(ymin=mean.y-sd.y, ymax=mean.y+sd.y), alpha=0.4) +
  scale_x_continuous(limits=c(0,11), breaks = 0:12) +
  theme_bw() +
  theme(panel.grid.minor = element_blank(),
        panel.grid.major = element_blank())
Run Code Online (Sandbox Code Playgroud)

或者,如果我们的标准是每当 x 值之间的距离大于 1 时就会出现不连续性:

data.1 %>% 
  mutate(g = c(0, cumsum(diff(X) > 1))) %>%
    ggplot(aes(X, mean.y, group=g)) +
      geom_line(color="red") +
      geom_ribbon(aes(ymin=mean.y-sd.y, ymax=mean.y+sd.y), alpha=0.4) +
      scale_x_continuous(limits=c(0,11), breaks = 0:12) +
      theme_bw() +
      theme(panel.grid.minor = element_blank(),
            panel.grid.major = element_blank())
Run Code Online (Sandbox Code Playgroud)

不管怎样,结果如下:

在此输入图像描述

以下是一些附加说明,用于回答评论中有关该mutate步骤如何创建分组列的问题:我们希望创建一个分组变量,用于分隔X不连续性之前和之后的值。diff在上面的代码中,我们使用和函数的组合来实现这一点cumsum

diff计算滞后差异。例如:

diff(data.1$X)
[1] 1 1 3 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

请注意,差异之一(3 和 6 之间的差异)是 3。现在让我们添加一个逻辑条件:

diff(data.1$X) > 1
[1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

现在我们有了一个逻辑值向量,其中TRUE标记差异大于一。cumsumTRUE视为等于 1 和FALSE等于 0。每次遇到 a 时,累加和的值就会加一TRUE,遇到 a 时,累加值将保持不变FALSE

cumsum(diff(data.1$X) > 1)
[1] 0 0 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

好的,现在我们有两组,标记不X连续性之前和之后的值(如果存在多个不连续性,我们将为每个不连续性获得一个新组)。但我们还没有完全完成。

请注意,接受长度为ndiff的向量并返回长度为n-1的向量。这只是因为 n 个值之间只有 n-1 个滞后差异。因此,我们添加一个前导零来获得与输入数据长度相同的向量:

c(0, cumsum(diff(data.1$X) > 1))
[1] 0 0 0 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)