5

我希望绘制两个时间序列,并根据当时哪个序列更大来遮蔽序列之间的空间。

这是两个系列——第一个是在一个数据框中,其中有一个当时较大的系列的指标

d1 <- read.csv("https://dl.dropbox.com/s/0txm3f70msd3nm6/ribbon%20data.csv?dl=1")

这就是融化的系列。

d2 <- read.csv("https://dl.dropbox.com/s/6ohwmtkhpsutpig/melted%20ribbon%20data.csv?dl=1")

我绘制的...

ggplot() + geom_line(data = d2,
                 aes(x = time, y = value, group = variable, color = variable)) +
         geom_hline(yintercept = 0, linetype = 2) +
         geom_ribbon(data = d1[d1$big == "B",],
                     aes(x = time, ymin = csa, 
                         ymax =  csb),
                         alpha  = .25,
                         fill = "#9999CC") +
         geom_ribbon(data = d1[d1$big == "A",],
                     aes(x = time, ymin = csb, 
                         ymax =  csa),
                     alpha  = .25,
                     fill = "#CC6666") +
         scale_color_manual(values = c("#CC6666" , "#9999CC"))

这导致...

结果图

为什么情节中间有一条多余的蓝带?

4

1 回答 1

9

这是一个解决方案。我data = d1[d1$big == "B",]在第一个geom_ribbon函数中替换为:

data = rbind(d1[d1$big == "B",],
             d1[c((which(diff(as.numeric(d1$big)) == -1) + 1),
                  (which(diff(as.numeric(d1$big)) == 1))), ])

这是必要的,因为d1$big == "B"序列的第一行和最后一行通常包含不同的csacsb值。结果,有一个可见的功能区连接数据。上述命令使用这些序列之前的最后一行和之后的第一行以及第一个功能区的数据。d1$big == "A"(第二个色带的底座)不存在此问题。

完整代码:

ggplot() +
 geom_line(data = d2,
           aes(x = time, y = value, group = variable, color = variable)) +
 geom_hline(yintercept = 0, linetype = 2) +
 geom_ribbon(data = rbind(d1[d1$big == "B",],
                          d1[c((which(diff(as.numeric(d1$big)) == -1) + 1),
                               (which(diff(as.numeric(d1$big)) == 1))), ]),
             aes(x = time, ymin = csa, ymax =  csb),
             alpha  = .25, fill = "#9999CC") +
 geom_ribbon(data = d1[d1$big == "A",],
             aes(x = time, ymin = csb, ymax =  csa),
             alpha  = .25, fill = "#CC6666") +
 scale_color_manual(values = c("#CC6666" , "#9999CC"))

在此处输入图像描述

于 2012-10-28T11:41:21.143 回答