如何在带有计算参数的循环中使用ggplot?

时间:2018-03-20 13:22:37

标签: r plot ggplot2 zoo

我试图在动物园对象的ggplot中生成可变数量的矩形(图层)。我想在一个循环中这样做,因为我不知道我需要多少个矩形。这是一个玩具的例子。

library("zoo")
library("ggplot2")
set.seed(1)
y <- runif(50, min = 1, max = 2)
start <- as.numeric(as.Date("2018-01-01"))
x <- as.Date(start:(start + 49))
x.zoo <- zoo(y, order.by = x)
## Fill areas
bars <- data.frame(start = c(x[5], x[20], x[35]),
                end = c(x[10], x[25], x[40]))

我可以使用以下代码手动绘制这些代码:

## Plot manually
print(autoplot.zoo(x.zoo, facets = NULL) +
        geom_rect(aes(xmin = bars[1,1],
                  xmax = bars[1,2], ymin = -Inf, ymax = Inf),
                  fill = "pink", alpha = 0.01) +
        geom_rect(aes(xmin = bars[2,1],
                  xmax = bars[2,2], ymin = -Inf, ymax = Inf),
                  fill = "pink", alpha = 0.01) +
        geom_rect(aes(xmin = bars[3,1],
                  xmax = bars[3,2], ymin = -Inf, ymax = Inf),
                  fill = "pink", alpha = 0.01))

这给了我这个想要的图像: Desired Image

我尝试使用下面的循环,但它只绘制了最后一个条形图。我该怎么办?

## This didn't work but illustrates what I am trying to do
p =  autoplot.zoo(x.zoo, facets = NULL)
for(i in 1:3) {
  p = p + geom_rect(aes(xmin = bars[i,1],
                    xmax = bars[i,2], ymin = -Inf, ymax = Inf),
                    fill = "pink", alpha = 0.01)

}
print(p)

2 个答案:

答案 0 :(得分:4)

您不需要循环。 geom_rect已被矢量化

autoplot.zoo(x.zoo, facets = NULL) +
  geom_rect(aes(xmin = start, xmax = end, ymin = -Inf, ymax = Inf), data = bars, fill = "pink", alpha = 0.4, inherit.aes = FALSE) 

答案 1 :(得分:1)

避免for循环的一种方法是将x.zoo转换为data.frame并将数据映射到geom_line。这样,您可以将bars数据分别映射到geom_rect

dat <- data.frame(index = index(x.zoo), data.frame(x.zoo))

ggplot() + 
  geom_rect(data = bars, aes(xmin = start, xmax = end, ymin =-Inf, ymax = Inf), fill = 'pink', alpha = .5) +
  geom_line(data=dat, aes(x = index, y = x.zoo))