来自三个连续变量的等值线图或热图
Contour plot or heatmap from three continuous variables
我有一个模型告诉我两个变量 a 和 b 之间存在交互作用,这对我的响应变量 c 有显着影响。这三个都是连续的数值变量。对于细节 c 是我的响应变量的变化率,b 是我的预测变量的变化率,a 是平均年降雨量。分析单位是栅格中的像素。所以我的模型告诉我平均年降雨量改变了我的预测变量如何影响我的反应。
为了可视化这种交互,我想使用等高线 plot/heat map/level 图,x 轴和 y 轴上有 a 和 b,c 提供颜色以显示我的响应变量如何变化在 a 和 b 描述的 space 内。我可以用散点图来做到这一点,但它不是很漂亮或不容易解释:
qplot(b, a, colour = c) +
scale_colour_gradient(low="green", high="red") +
当我尝试绘制等高线时 plot/heat map/level 虽然我得到的只是错误、空白图或丑陋的图。
geom_contour
给我一个错误:
ggplot(data = Mod, aes(x = Rain, y = Bomas, z = Fire)) +
geom_contour()
Warning message:
Not possible to generate contour data
geom_raster
最初给我 Error: cannot allocate vector of size 81567.2 Gb
但是当我四舍五入我的数据时它产生:
ggplot(data = df, aes(x = a, y = b, z = c)) +
geom_raster(aes(fill = c))
将 interpolate = TRUE
添加到 geom_raster
代码只会使线条有点模糊。
geom_tile
生成空白图,但带有 c:
的比例尺
ggplot(data = df, aes(x = a, y = b, z = c)) +
geom_tile(aes(color = c))
我也尝试过使用 stat_density2d
并将填充 and/or 颜色设置为 c,但出现错误,我尝试在 lattice
包也是如此,但是会产生这个:
levelplot(c ~ a * b, data = df,
aspect = "asp", contour = TRUE,
xlab = "a",
ylab = "b")
我怀疑我遇到的问题是因为函数没有设置为处理连续的 x 和 y 变量,所有示例似乎都使用了因子。我本以为我可以通过改变 bin 宽度来弥补这一点,但这似乎也不起作用。有没有一个函数可以让你制作一个包含 3 个连续变量的热图?或者我是否需要将我的 a 和 b 变量视为因子并手动制作一个包含适合我的数据的 bin 的数据框?
如果您想自己试验,那么您会遇到与我遇到的问题类似的问题:
df<- as.data.frame(rnorm(1:1068))
df[,2] <- rnorm(1:1068)
df[,3] <- rnorm(1:1068)
names(df) <- c("a", "b", "c")
您可以获得自动分箱,例如使用 stat_summary_2d
:
计算均值
ggplot(df, aes(a, b, z = c)) +
stat_summary_2d() +
geom_point(shape = 1, col = 'white') +
viridis::scale_fill_viridis()
另一个不错的选择是用第三个变量分割数据,并绘制小的倍数。不过,这对于随机数据来说并不是很好:
library(ggplot2)
ggplot(df, aes(a, b)) +
geom_point() +
facet_wrap(~cut_number(c, 4))
我有一个模型告诉我两个变量 a 和 b 之间存在交互作用,这对我的响应变量 c 有显着影响。这三个都是连续的数值变量。对于细节 c 是我的响应变量的变化率,b 是我的预测变量的变化率,a 是平均年降雨量。分析单位是栅格中的像素。所以我的模型告诉我平均年降雨量改变了我的预测变量如何影响我的反应。
为了可视化这种交互,我想使用等高线 plot/heat map/level 图,x 轴和 y 轴上有 a 和 b,c 提供颜色以显示我的响应变量如何变化在 a 和 b 描述的 space 内。我可以用散点图来做到这一点,但它不是很漂亮或不容易解释:
qplot(b, a, colour = c) +
scale_colour_gradient(low="green", high="red") +
当我尝试绘制等高线时 plot/heat map/level 虽然我得到的只是错误、空白图或丑陋的图。
geom_contour
给我一个错误:
ggplot(data = Mod, aes(x = Rain, y = Bomas, z = Fire)) +
geom_contour()
Warning message:
Not possible to generate contour data
geom_raster
最初给我 Error: cannot allocate vector of size 81567.2 Gb
但是当我四舍五入我的数据时它产生:
ggplot(data = df, aes(x = a, y = b, z = c)) +
geom_raster(aes(fill = c))
将 interpolate = TRUE
添加到 geom_raster
代码只会使线条有点模糊。
geom_tile
生成空白图,但带有 c:
ggplot(data = df, aes(x = a, y = b, z = c)) +
geom_tile(aes(color = c))
我也尝试过使用 stat_density2d
并将填充 and/or 颜色设置为 c,但出现错误,我尝试在 lattice
包也是如此,但是会产生这个:
levelplot(c ~ a * b, data = df,
aspect = "asp", contour = TRUE,
xlab = "a",
ylab = "b")
我怀疑我遇到的问题是因为函数没有设置为处理连续的 x 和 y 变量,所有示例似乎都使用了因子。我本以为我可以通过改变 bin 宽度来弥补这一点,但这似乎也不起作用。有没有一个函数可以让你制作一个包含 3 个连续变量的热图?或者我是否需要将我的 a 和 b 变量视为因子并手动制作一个包含适合我的数据的 bin 的数据框?
如果您想自己试验,那么您会遇到与我遇到的问题类似的问题:
df<- as.data.frame(rnorm(1:1068))
df[,2] <- rnorm(1:1068)
df[,3] <- rnorm(1:1068)
names(df) <- c("a", "b", "c")
您可以获得自动分箱,例如使用 stat_summary_2d
:
ggplot(df, aes(a, b, z = c)) +
stat_summary_2d() +
geom_point(shape = 1, col = 'white') +
viridis::scale_fill_viridis()
另一个不错的选择是用第三个变量分割数据,并绘制小的倍数。不过,这对于随机数据来说并不是很好:
library(ggplot2)
ggplot(df, aes(a, b)) +
geom_point() +
facet_wrap(~cut_number(c, 4))