我最近升级到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:
和情节2:
此外,如果我使用alpha
- 值(例如将它们设置为0.01
,我会得到以下两个图:
和
答案 0 :(得分:2)
我认为在没有geom_rect
参数的情况下调用data
会有效地为data.frame
的每一行绘制一个单独的矩形,这就是alpha
“工作”的原因,但并不像预期的那样。我无法复制并获得方法之间的奇偶性/一致性,但正如您所指出的,我认为它正在绘制100个单独的矩形或30个(矩形的宽度;从20到20) 50)这就是alpha = 0.1 / 100
和alpha = 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")