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

时间:2020-06-10 20:46:09

标签: 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())

这是我得到的输出:

enter image description here

这就是我想要得到的:

enter image description here

任何有关如何完成此操作的提示将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:3)

您可以添加分组列,以在截止点的上方和下方标记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())

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

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

无论哪种方式,这都是结果图:

enter image description here

以下是一些其他解释,以回答评论中有关mutate步骤如何创建分组列的问题:我们要创建一个分组变量,该变量在不连续前后将X值分开。在上面的代码中,我们结合使用diffcumsum函数。

diff计算滞后差。例如:

diff(data.1$X)
[1] 1 1 3 1 1 1 1 1

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

diff(data.1$X) > 1
[1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

因此,我们现在有了一个逻辑值向量,其中TRUE标记的差异大于1。 cumsumTRUE视为1,将FALSE视为零。每次遇到TRUE时,累积总和的值将增加1,遇到FALSE时,其累积值将保持恒定。

cumsum(diff(data.1$X) > 1)
[1] 0 0 1 1 1 1 1 1

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

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

c(0, cumsum(diff(data.1$X) > 1))
[1] 0 0 0 1 1 1 1 1 1