ggplot geom_linerange 中的 Alpha 由 Mac 上的观察次数确定
Posted
技术标签:
【中文标题】ggplot geom_linerange 中的 Alpha 由 Mac 上的观察次数确定【英文标题】:Alpha in ggplot geom_linerange determined by number of observations on Mac 【发布时间】:2021-12-28 00:24:31 【问题描述】:我正在使用 geom_linerange 函数绘制一些数据。这是 5-10 年的每日观察结果,具体取决于数据集。
在我的 Mac 上运行脚本时,linerange alpha 会根据每个图中的观察次数而变化。但是,我希望所有地块都具有 alpha=1。在 geom_linerange 函数中显式设置 alpha 对绘图没有影响 - 当绘制大量观察值时,颜色仍然是透明的。
当我在我的 Windows 笔记本电脑上使用完全相同的脚本时,绘图是正确的,默认 alpha 为 1。
下面是一个最小的工作示例:
library(ggplot2)
library(gridExtra)
df1 = data.frame(name = c("A","B","C"),
Date = rep(seq(as.Date("2010-01-01"),as.Date("2018-01-01"),by=1),each=3),
value = runif(8769,-1,1))
df2 = data.frame(name = c("A","B","C"),
Date = rep(seq(as.Date("2010-01-01"),as.Date("2014-01-01"),by=1),each=3),
value = runif(4386,-1,1))
df3 = data.frame(name = c("A","B","C"),
Date = rep(seq(as.Date("2010-01-01"),as.Date("2011-01-01"),by=1),each=3),
value = runif(1098,-1,1))
Plot1 = ggplot() +
geom_linerange(data=df1,aes(x=name,ymin=Date,ymax=Date+1,colour=value),size=15) +
scale_colour_gradient2(low="red",mid="white",high="blue",midpoint=0,name = "Value") +
theme_bw() +
coord_flip() +
xlab("Driver") +
ylab("")
Plot2 = ggplot() +
geom_linerange(data=df2,aes(x=name,ymin=Date,ymax=Date+1,colour=value),size=15) +
scale_colour_gradient2(low="red",mid="white",high="blue",midpoint=0,name = "Value") +
theme_bw() +
coord_flip() +
xlab("Driver") +
ylab("")
Plot3 = ggplot() +
geom_linerange(data=df3,aes(x=name,ymin=Date,ymax=Date+1,colour=value),size=15) +
scale_colour_gradient2(low="red",mid="white",high="blue",midpoint=0,name = "Value") +
theme_bw() +
coord_flip() +
xlab("Driver") +
ylab("")
grid.arrange(Plot1,Plot2,Plot3)
以下是我 Mac 上的输出。顶部的图,具有最多的观察,具有最低的 alpha:
以下是我的 Windows 上的输出 - 如您所见,所有图的 alpha=1:
代码通过 GitHub repos 传输。
不幸的是,我完全不知道为什么会发生这种情况。这是 Mac 上的预期行为,还是我做错了什么?
非常感谢!
【问题讨论】:
我猜这是因为抗锯齿。你有比像素更多的线来绘制它们,所以顶部的图看起来模糊/较低的 alpha,因为你的 mac 设备是抗锯齿的,但你的 windows 绘图引擎(我猜不是 Cairo 或 ragg,默认情况下实现抗锯齿)是不是。获得所需内容的最简单方法可能是以更高分辨率或使用 svg 等矢量设备进行绘图。 @JonSpring 解决了!以比 ggsave 默认值(我设置dpi=1440
)更高的分辨率进行绘图会产生所需的正确 alpha。太感谢了。如果您想将此作为答案发布,我可以将其标记为解决方案:)
【参考方案1】:
这是高频数据与图形设备之间交互的结果,尤其是其抗锯齿设置/功能。在这种情况下,我们尝试使用(在下面的示例中)仅大约 600 像素的绘图宽度来绘制大约 2,900 天的数据。每个像素代表大约 4 天的数据,抗锯齿提供了更“模糊”的外观,而没有抗锯齿的绘图更好地显示了数据范围(以显示更少的数据为代价;我猜我们正在有效地看到每四天的数据)。
在 Windows 中,我相信 Plot 窗口的默认图形设备是 Quartz,没有抗锯齿。 Plot1+Plot2 在该设置下看起来像这样:
如果我在 RStudio 全局设置中启用抗锯齿,我会得到与 Mac 类似的结果,因为它的默认图形设备使用抗锯齿。
获得所需内容的最简单方法是将分辨率提高到足以每天提供至少一个像素的程度;这样您就可以表示 100% 的数据并使用您的色标的全部范围。您还可以输出为svg
等矢量格式,以实现更高的有效分辨率。
或者,根据您的数据的性质和您要显示的内容,您可能会在您的日子里取一个滚动平均值(我希望结果会类似于抗锯齿输出),或者获取一个滚动最大值或min 或 SD,或其他一些更直接地捕获您想要的东西的汇总度量,但在更易于消化的时间粒度。您还可以考虑其他更容易让读者映射到值的几何图形(如折线图、散点图或水平图)。
【讨论】:
以上是关于ggplot geom_linerange 中的 Alpha 由 Mac 上的观察次数确定的主要内容,如果未能解决你的问题,请参考以下文章