我最近升级到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:
和情节2:
另外,如果我使用alpha-values(例如设置它们0.01,我会得到以下两个图:
和
我相信,geom_rect不带data参数的调用将有效地为每一行绘制一个单独的矩形,这data.frame就是为什么它alpha“工作”,但并不完全符合预期。我无法复制并在方法之间达成奇偶校验/协议,但正如您所指出的,我认为它正在沿着绘制 100 个单独的矩形或 30 个(矩形的宽度;从 20 到50) 这就是为什么alpha = 0.1 / 100,alpha = 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)