R中的六角形和热度密度图

问题描述

我正在尝试创建一张图像,该图像显示机器相对于温度和湿度的误差。阅读论文后(参见下图),看来最好的方法显示这些错误的六边形或密度图。我的问题是,每次创建(1)密度图时,都会生成一个灰色图,该图实际上根本不显示任何数据(2)六角图,它仅显示计数数据。

Example of my subset of my data (with only the temperature,humidity and PMdata included as thats what I want to display

library(ggplot2)
ggplot(DM_EPA_1H)+
geom_hex(aes(x=Relative.humidity,y=Temperature,color=Diff_PM1)

Image produced with the hex

上面的图像符合我的要求,但是显然它难以解释,因为它具有计数数据。我无法确定在什么情况下(温度/湿度)会看到错误

ggplot(DM_EPA_1H,aes(x=Relative.humidity,y=Temperature),na.rm = FALSE)+
stat_density_2d(aes(fill=Diff_PM1),geom = "polygon")+
scale_fill_viridis_c()

Image produced by stat_density

上面这张图片不是很容易解释,也不确定要获得理想结果的下一个最佳途径。

Desired format for displaying data. Credit Lui et al.,2019 (Atmosphere,10,41)

不幸的是,上面的图像没有任何有关如何生成这些图像的源代码,因此很难进行复制。仍然有可能甚至没有在ggplot中完成,但对我来说,它看起来像源代码

感谢您的帮助。让我知道是否需要进一步澄清

解决方法

使用stat_summary_hexgeom_density2d。使用stat_summary_hex,您可以指定要为每个bin计算的内容,而不是计数。在这里,我假设您想要平均数,但实际上可以使用任何函数。另外,您由于没有提供任何示例数据而使操作变得有些困难,因此我随机生成了一些数据。

library(tidyverse)

set.seed(0)
DM_EPA_1H = tibble(Relative.humidity = (rbeta(1000,6,1.3)) * 100,Temperature = rnorm(1000,mean = 50,sd = 10),Diff_PM1 = rnorm(1000,mean = 0,sd = 5))

ggplot(DM_EPA_1H,mapping = aes(x = Relative.humidity,y = Temperature)) +
  stat_summary_hex(mapping = aes(z = Diff_PM1),fun = ~mean(.x)) +
  scale_fill_steps2(low = "#eb0000",mid = "#e0e0e0",high = "#1094c4") +
  geom_hex(stat = "identity") +
  geom_density2d(colour = "black") +
  geom_point(size = 0.5)

这大致复制了原始图:

roughly reproduced original plot from Lui et al. 2019

当然,如果您要按照第二个代码示例中的说明使用viridis,则也可以使用scale_fill_viridis_c而不是scale_fill_steps2来做到这一点。