Ggplot2不同的alpha行为

Dav*_*vid 9 r ggplot2

我最近升级到R版本3.2.3,也升级到ggplot版本2.0.0.

尝试将一些旧代码升级到较新版本我遇到了ggplot2及其透明度设置的奇怪行为.

现在我的问题是,这是一个错误还是一个功能(如果是这样,有人可以告诉我为什么这样做有好处)?我想要的结果是(显然)情节2.

假设我绘制一条线并在其上放置一个透明的矩形,如下所示:

library(ggplot2)

plot_data <- data.frame(x = 1:100, y = rnorm(100))

# Plot 1
ggplot(data = plot_data, aes(x = x, y = y)) + 
  geom_line() + 
  geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", 
            alpha = 0.1) + ggtitle("Plot 1")

# Plot 2
ggplot() + 
  geom_line(data = plot_data, aes(x = x, y = y)) + 
  geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", 
            alpha = 0.1) + ggtitle("Plot 2")
Run Code Online (Sandbox Code Playgroud)

根据我的理解,情节1和2应该是相同的.但是,我得到以下情节:

情节1:

Plot1

和情节2:

Plot2

另外,如果我使用alpha-values(例如设置它们0.01,我会得到以下两个图:

Plot1a

Plot2a

Jas*_*lns 2

我相信,geom_rect不带data参数的调用将有效地为每一行绘制一个单独的矩形,这data.frame就是为什么它alpha“工作”,但并不完全符合预期。我无法复制并在方法之间达成奇偶校验/协议,但正如您所指出的,我认为它正在沿着绘制 100 个单独的矩形或 30 个(矩形的宽度;从 20 到50) 这就是为什么alpha = 0.1 / 100alpha = 0.1 / 30会让你们更亲近,但并不完全匹配。

无论如何,我可能会使用annotate,因为这更好地描述了您试图在没有问题的情况下实现的行为/结果,并且按预期工作,在两种情况下 -annotations将绘制每个实例geom

ggplot(data = plot_data, aes(x = x, y = y)) + 
  # geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, alpha = 0.1, fill = "red")) +
  annotate("rect", xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, alpha = 0.1, fill = "red") +
  geom_line() + 
  ggtitle("Plot 1")

ggplot() + 
  geom_line(data = plot_data, aes(x = x, y = y)) + 
  # geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", alpha = 0.1) + 
  annotate("rect", xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, fill = "red", alpha = 0.1) +
  ggtitle("Plot 2")
Run Code Online (Sandbox Code Playgroud)