在 R 中生成具有视觉吸引力的密度热图

机器算法验证 r 数据可视化 空间的
2022-01-24 07:38:17

虽然我知道在 R 中有一系列用于生成热图的函数,但问题是我无法生成具有视觉吸引力的地图。例如,下面的图片是我想要避免的热图的好例子。第一个显然缺乏细节,而另一个(基于相同的点)太详细而无用。这两个图都是由spatstat R 包中的 density() 函数生成的。

我怎样才能让更多的“流量”进入我的地块?我的目标是更多的商业SpatialKey ( screenshot ) 软件能够产生的结果。

有什么提示、算法、包或代码行可以带我朝这个方向发展吗?

在此处输入图像描述

4个回答

有两件事会影响绘图的平滑度,用于内核密度估计的带宽和在绘图中分配颜色的中断。

根据我的经验,对于探索性分析,我只是调整带宽,直到得到有用的图。下面演示。

library(spatstat)
set.seed(3)
X <- rpoispp(10)
par(mfrow = c(2,2))
plot(density(X, 1))
plot(density(X, 0.1))
plot(density(X, 0.05))
plot(density(X, 0.01))

在此处输入图像描述

简单地更改默认配色方案将无济于事,更改像素的分辨率也无济于事(如果默认分辨率太精确,您应该降低分辨率并使像素更大)。尽管出于美学目的您可能想要更改默认配色方案,但它旨在具有高度区分性。

您可以做的帮助颜色的事情是将比例级别更改为对数(只有在您有一个非常不均匀的过程时才会真正有帮助),更改调色板以在较低端变化更多(在色带规范方面的偏差) R),或调整图例以具有离散箱而不是连续箱。

图例中的偏差示例改编自这里,我在 GIS 网站上还有一篇文章,在这里的一个非常简单的示例中解释了离散箱的着色。如果图案一开始就过度平滑或平滑不足,这些都无济于事。

Z <- density(X, 0.1)
logZ <- eval.im(log(Z))
bias_palette <- colorRampPalette(c("blue", "magenta", "red", "yellow", "white"), bias=2, space="Lab")
norm_palette <- colorRampPalette(c("white","red"))
par(mfrow = c(2,2))
plot(Z)
plot(logZ)
plot(Z, col=bias_palette(256))
plot(Z, col=norm_palette(5))

在此处输入图像描述


要使最后一个图像中的颜色透明(第一个颜色箱是白色的),可以只生成颜色渐变,然后用透明颜色替换 RGB 规范。下面的示例使用与上述相同的数据。

library(spatstat)
set.seed(3)
X <- rpoispp(10)
Z <- density(X, 0.1)
A <- rpoispp(100) #points other places than density


norm_palette <- colorRampPalette(c("white","red"))
pal_opaque <- norm_palette(5)
pal_trans <- norm_palette(5)
pal_trans[1] <- "#FFFFFF00" #was originally "#FFFFFF" 

par(mfrow = c(1,3))
plot(A, Main = "Opaque Density")
plot(Z, add=T, col = pal_opaque)
plot(A, Main = "Transparent Density")
plot(Z, add=T, col = pal_trans)


pal_trans2 <- paste(pal_opaque,"50",sep = "")
plot(A, Main = "All slightly transparent")
plot(Z, add=T, col = pal_trans2)

在此处输入图像描述

您可能会受益于 akima 包中的 interp 函数。如果需要,这将使您可以将矩阵内插到另一个分辨率。要制作类似于链接示例的内容,您需要插入一个非常精细的网格(可能参数 xo 和 yo 的长度约为 1000)。这将为您提供一个可以使用 image() 绘制的新矩阵。如果你想要透明度,这将需要一些额外的工作。使用调色板做到这一点并不容易,因此您最终可能不得不将每个网格绘制为具有指定颜色的多边形。

您可能想查看 ggplot2。您尝试过的软件包似乎没有很好的配色方案或“流程”——看看 RColorBrewer。有一个博客用一个简单的例子实现了这些包。

我不确定您是否尝试绘制链接示例中显示的地理数据,但如果您知道 Google 提供“静态地图 API V2 开发人员指南”,您可以将 Google 和 R与名为 RgoogleMaps 的包结合使用.

祝你的研究好运。

您是否尝试过提高分辨率density尝试论点dimyx=c(512, 512)或更高。