【问题标题】:ggplot2: how to transparently shade alternate days on a plotggplot2:如何在绘图上透明地遮蔽隔日
【发布时间】:2012-05-20 19:02:02
【问题描述】:

请问我在这里做错了什么? 我正在尝试用透明灰色遮蔽每天 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 都会覆盖最后一个,而不是像你想象的那样合成。

标签: r ggplot2 vectorization alpha-transparency occlusion


【解决方案1】:

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

然后,请注意是否将变量映射到美学。在您的情况下,您需要将 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))

【讨论】:

  • 很可能是全部,但我从来没有打扰过qplotggplot 并不难学,而且你总是知道你会得到什么。对不起。
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
相关资源
最近更新 更多