Ggplot2不同的alpha行为

时间:2016-01-25 12:46:08

标签: 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")

据我所知,情节1和2应该是相同的。但是,我得到以下情节:

情节1:

Plot1

和情节2:

Plot2

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

Plot1a

Plot2a

1 个答案:

答案 0 :(得分:2)

我认为在没有geom_rect参数的情况下调用data会有效地为data.frame的每一行绘制一个单独的矩形,这就是alpha“工作”的原因,但并不像预期的那样。我无法复制并获得方法之间的奇偶性/一致性,但正如您所指出的,我认为它正在绘制100个单独的矩形或30个(矩形的宽度;从20到20) 50)这就是alpha = 0.1 / 100alpha = 0.1 / 30让你更接近但不完全匹配的原因。

无论如何,我可能会使用annotate,因为这样可以更好地描述您尝试实现的行为/结果,而不会出现任何问题和工作,正如预期的那样,在这两种情况下 - annotations将绘制<每个geom的em>单个实例:

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")