在R中生成视觉上吸引人的密度热图


27

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

如何获得更多的“流量”?我的目标是获得更多商用SpatialKey屏幕截图)软件能够产生的外观。

有什么提示,算法,程序包或代码行可以带我朝这个方向前进吗?

在此处输入图片说明


您看过image()函数了吗?增加中断次数可提高分辨率。
2012年

Answers:


28

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

以我的经验,为进行探索性分析,我只是调整带宽,直到获得有用的图形为止。下面的演示。

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)

在此处输入图片说明


谢谢你,答案很明确。这与您直接执行的“ spatstat.options(npixel = c(100,100))”命令结合在一起。如果我可以打扰您一些:您知道如何使“背景”颜色透明吗?
Figaro '04

1
@Figaro,我更新了一个使颜色半透明的示例。
Andy W

谢谢。还有一件事。尽管这可能与主题略有出入:如何将这些热图导出到Shape文件中?还是我只需要将它们视为栅格?
费加罗

我从来没有这样做,所以我不能随便说。对于R专家的stackoverflow来说,这可能是个好问题。
Andy W

可以将热图显示为栅格以外的其他内容吗?
费加罗报

2

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


您有创建透明度的经验吗?有例子吗?那将是下一步。
Figaro 2012年

如何创建interp()所需的x,y,z值?例如,如果density()使用100x100网格,则我具有每个点的z值,但我没有所需矢量格式的x&y(我仅具有轴的坐标)。
费加罗报

做了一个循环来获取坐标对,但是有一个函数吗?
费加罗报

2
看起来图像毕竟可以接受透明颜色。请参阅:menugget.blogspot.de/2012/04/…。如果您仍想使用interp,则可以使用以下方法为z级别生成xy坐标组合:“ grid <-expand.grid(x = x,y = y)”
Marc

1

您可能需要研究ggplot2。您尝试过的程序包似乎没有很好的配色方案或“流程”,请看一下RColorBrewer。有一个博客通过一个简单的示例实现了这些软件包。

我不确定您是否要按照链接的示例所示来绘制地理数据,但是如果您知道Google提供了《 Static Maps API V2开发人员指南》,则可以将Google和R与名为RgoogleMaps的软件包结合使用。

祝您研究顺利。


抱歉,如果我不清楚,但现在的问题不是配色方案本身。但是我今天早些时候尝试了RColorBrewer:一个很棒的小玩意!它是空间数据,我不确定是否要使用Google API,但我可能会看一下。
费加罗报

0

您是否尝试提高中的分辨率density?尝试使用参数dimyx=c(512, 512)或更高的参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.