r 热图 - stat_density2d(ggmap)与 addHeatmap(闪亮传单) [英] r heatmap - stat_density2d (ggmap) vs. addHeatmap (shiny leaflet)
问题描述
我使用 library(ggmap)
和 stat_density2d()
函数制作了静态热图.为了在动态 leaflet
地图上的闪亮应用程序中重新创建它,我找到了 addHeatmap()
.然而,生成的图像是不同的,ggmap
版本似乎提供了正确的结果.
GGMAP
传单
造成这种差异的原因是什么?
要运行以下两个可重现的示例,您可以下载我放在这里的一些数据(csv 文件).
将热图想象成函数的可视化
<块引用>f(pixel) = ∑ ( max( 0, 半径 - 距离(pixel, point) ) · 强度(point) )
可以调整热图的半径和强度,但结果永远不会与统计密度估计相同.
I made static heatmaps with the library(ggmap)
and the stat_density2d()
function. Looking to recreate this in a shiny app on a dynamic leaflet
map, I found addHeatmap()
. However, the resulting images are dissimilar, with the ggmap
version seemingly offering the correct result.
GGMAP
LEAFLET
What is causing this difference?
To run both of the below reproducible examples, you can download some data (csv file) I put here. https://drive.google.com/drive/folders/0B8_GTHBuoKSRR1VIRmhOUTJKYU0?usp=sharing
Note that the leaflet
result differs with zoom level, but never matches the ggmap
result (e.g. in terms location of maximum heat).
This is the ggmap
code.
library(ggmap)
data <- read.csv("DATA.csv", sep=";")
data <- subset(data, !is.na(CrdLatDeg))
xmin <- min(data$CrdLonDeg)
xmax <- max(data$CrdLonDeg)
ymin <- min(data$CrdLatDeg)
ymax <- max(data$CrdLatDeg)
lon <- c(xmin,xmax)
lat <- c(ymin,ymax)
map <- get_map(location = c(lon = mean(lon), lat = mean(lat)), zoom = 17,
maptype = "satellite", source = "google")
ggmap(map) +
labs(x="longitude", y="latitude") +
stat_density2d(data=data, aes(x=CrdLonDeg, y=CrdLatDeg, alpha= ..level.., fill= ..level..), colour=FALSE,
geom="polygon", bins=100) +
scale_fill_gradientn(colours=c(rev(rainbow(100, start=0, end=.7)))) + scale_alpha(range=c(0,.8)) +
guides(alpha=FALSE,fill=FALSE)
This is the leaflet
code.
library(leaflet.extras)
data <- read.csv("DATA.csv", sep=";")
data <- subset(data, !is.na(CrdLatDeg))
leaflet(data) %>%
addTiles(group="OSM") %>%
addHeatmap(group="heat", lng=~CrdLonDeg, lat=~CrdLatDeg, max=.6, blur = 60)
The images look different because the algorithms are different.
stat_density2d()
extrapolates a probability density function from the discrete data.
Leaflet implementation of heatmaps rely on libraries like simpleheat, heatmap.js or webgl-heatmap. These heatmaps do not rely on probability density. (I'm not fully sure which of these is used by r-leaflet's addHeatmap
).
Instead, these heatmaps work by drawing a blurred circle for each point, raising the value of each pixel by an amount directly proportional to the intensity of the point (constant in your case), and inversely proportional to the distance between the point and the circle. Every data point is shown in the heatmap as a circle. You can see this by playing with your mouse cursor in the heatmap.js webpage, or by looking at this lone point in the top-right of your image:
Think of a heatmap like a visualization of the function
f(pixel) = ∑ ( max( 0, radius - distance(pixel, point) ) · intensity(point) )
One can tweak the radius and intensity of heatmaps, but the result will never be the same as a statistical density estimation.
这篇关于r 热图 - stat_density2d(ggmap)与 addHeatmap(闪亮传单)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!