三个连续变量的轮廓图或热图

时间:2017-12-07 16:12:20

标签: r plot ggplot2 heatmap levelplot

我有一个模型告诉我两个变量之间存在相互作用:a和b,它对我的​​响应变量产生了重大影响:c。这三个都是连续的数字变量。对于细节c,我的响应变量的变化率,b是我的预测变量的变化率,a是年平均降雨量。分析单位是栅格中的像素。所以我的模型告诉我年均降雨量会改变我的预测因子如何影响我的反应。

为了使这种交互可视化,我想在x和y轴上使用a和b的等高线图/热图/水平图,并提供颜色以显示我的响应变量如何在a描述的空间内变化和b。我可以用散点图来做到这一点,但它不是很漂亮或很容易解释:

qplot(b, a, colour = c) +
  scale_colour_gradient(low="green", high="red") +

enter image description here

当我尝试绘制轮廓图/热图/水平图时,虽然我得到的只是错误,空白图或丑陋的图。

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))

enter image description here

interpolate = TRUE添加到geom_raster代码只会​​使线条模糊不清。

geom_tile生成一个空白图表,但带有c:

的比例尺
ggplot(data = df, aes(x = a, y = b, z = c)) +
  geom_tile(aes(color = c))

enter image description here

我也尝试过使用stat_density2d并将填充和/或颜色设置为c,但刚出错,我尝试在levelplot中使用lattice包也可以产生这个:

levelplot(c ~ a * b, data = df,
          aspect = "asp", contour = TRUE,
          xlab = "a",
          ylab = "b")

enter image description here

我怀疑我遇到的问题是因为没有设置函数来处理连续的x和y变量,所有的例子似乎都使用了因子。我原本以为我可以通过更改bin宽度来弥补这一点,但这似乎也不起作用。是否有一个功能允许您使用3个连续变量制作热图?或者我是否需要将a和b变量视为因子并手动创建适合我的数据的数据框?

如果您想亲自体验,那么您遇到的问题与我所遇到的类似:

df<- as.data.frame(rnorm(1:1068))
df[,2] <- rnorm(1:1068)
df[,3] <- rnorm(1:1068)
names(df) <- c("a", "b", "c")

1 个答案:

答案 0 :(得分:2)

您可以获得自动分档,例如使用stat_summary_2d

计算均值
ggplot(df, aes(a, b, z = c)) +
  stat_summary_2d() +
  geom_point(shape = 1, col = 'white') +
  viridis::scale_fill_viridis()

enter image description here

另一个好的选择是按第三个变量对数据进行切片,并绘制小的倍数。尽管如此,这对随机数据并没有很好的表现:

library(ggplot2)
ggplot(df, aes(a, b)) +
  geom_point() +
  facet_wrap(~cut_number(c, 4))

enter image description here