如何在图表上透明地为交替的日期添加阴影?

14
请问我在这里做错了什么? 我试图用透明灰色来填充交替的24小时矩形。但是只有for循环中的最后一个矩形被绘制出来(?!?) 如果我手动操作而不是使用for循环,就能正常工作。
有没有一种方法可以矢量化这个过程,避免使用for循环? (并且可以用qplot完成吗?) 我对ggplot2还不熟悉,是的,我已经阅读了Hadley的网站、书籍和示例。
第二个问题:美学上的alpha设置无法防止矩形遮挡背景。如何实现透明度?
dat <- data.frame(my_x_series=1:192, my_y_series=5.0*runif(192))
# (ymin, ymax are computed for this series using min/max(na.rm==TRUE))
ymax <- 5.0
ymin <- 0.0
p <- ggplot(dat, aes(x=my_x_series,alpha=0.9)) 
alternate_daily_bars_xmin <- c(4,52,100,148)

for (shade_xmin in alternate_daily_bars_xmin) {
    shade_xmax <- min(shade_xmin+24, 192) # clamp at end of x-range
    p <- p + geom_rect(aes(alpha=0.5,xmin=shade_xmin,xmax=shade_xmax,ymin=ymin,ymax=ymax), fill='gray80')
}
p <- p + geom_point(aes(y=my_y_series))
p

为了可重现性,添加了* dat *的随机定义。具体命令语法让我很困惑。我猜每个geom_rect都会覆盖上一个,而不是像你期望的那样合成。 - smci
1个回答

29

要绘制矩形,请创建一个数据框,其中每一行都包含单个矩形的坐标。这种构造适用于所有多边形,而不仅仅是矩形。一旦你知道这点,就很容易避免使用循环。

然后,只需注意将变量映射到美学元素中是否正确即可。在您的情况下,您需要将alpha设置为您希望的任何值,以便它不成为aes()设置的一部分。

library(ggplot2)

dat <- data.frame(my_x_series=1:192, my_y_series=5.0*runif(192))
rect_left <- c(4,52,100,148)
rectangles <- data.frame(
  xmin = rect_left,
  xmax = rect_left + 24,
  ymin = 0,
  ymax = 5
)

ggplot() +
  geom_rect(data=rectangles, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), 
            fill='gray80', alpha=0.8) +
  geom_point(data=dat, aes(x=my_x_series, y=my_y_series))

输入图像描述


10
很可能全部都是这样,但我从未费心去学习“qplot”。学习“ggplot”并不比它更难,而且你总是清楚地知道你会得到什么。抱歉。 - Andrie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接