如何使用ggmap将手动计算的密度绘制到地图上?

时间:2016-12-05 18:44:05

标签: r plot ggplot2 geospatial heatmap

我想绘制一张热图,显示芝加哥公交车站的接近程度,使用曼哈顿距离(L1)代替欧几里得和倒数平方权重,使用平均每日乘客量作为比例因子。

为了加载地图,我使用ggmap

require(ggmap)
chicago_map = get_map(location = c(lon=-87.64,lat=41.8787),zoom=14)

以下是使用的示例:

require(foreach)
require(geosphere)
bounding_box = bb = list(c(41.96,-87.75),c(41.80,-87.6))
meter_per_lat = distVincentyEllipsoid(rev(bb[[1]]), 
                                      rev(bb[[1]] + c(1,0)))
meter_per_lon = distVincentyEllipsoid(rev(bb[[1]]), 
                                      rev(bb[[1]] + c(0,1)))
dist_converter = c(meter_per_lon, meter_per_lat)
dist_manhattan <- function(p1, p2){
  #assume 20 meters is the smallest distance between points 
  pmax(20,abs(sweep(p2,2, p1)) %*% dist_converter)
}
set.seed(0)
sample_data = data.frame(longitude=runif(20,bb[[1]][2],bb[[2]][2]),
                         latitude =runif(20,bb[[2]][1],bb[[1]][1]),
                         mean_riders=4*rpois(20,500))
chicago_grid = expand.grid(latitude=seq(bb[[1]][1], bb[[2]][1],length.out=200), 
                           longitude=seq(bb[[1]][2],bb[[2]][2],length.out=400))
mean_values = foreach(i=1:20, .combine='+') %do% {
    row = sample_data[i,]
    dists = dist_manhattan(c(row$longitude,row$latitude), 
             as.matrix(chicago_grid[,c('longitude','latitude')]))
    return(row$mean_riders / dists^2)

}

chicago_data = chicago_grid
chicago_data$rider_weight = mean_values

对于绘图,我用geom_point()

进行近似
ggmap(chicago_map, extent='device') + geom_point(data=chicago_data, 
        aes(x=longitude,y=latitude,color=rider_weight,alpha=0.2,shape='15',size=4)) +
      scale_alpha_identity() + scale_color_gradient(low='blue',high='red') +
      scale_size_identity() + guides(shape='none') + ggtitle('Chicago Station Example Map')

虽然你可以看到&#34;热图&#34;的部分内容。有点清楚,这显然不是最佳解决方案。

Attempt at plot

如果我尝试使用geom_tile,我可以获得一张看起来不错的地图,但生成时间要长得多(这是不可取的)

ggmap(chicago_map, extent='device') + geom_tile(data=chicago_data, 
        aes(x=longitude,y=latitude,fill=rider_weight,alpha=0.6)) +
      scale_alpha_identity() + scale_fill_gradient(low='blue',high='red') +
      scale_size_identity() + guides(shape='none') + ggtitle('Chicago Station Example Map') 

enter image description here

我也可以将geom_tile替换为geom_raster,但geom_raster不能在笛卡尔坐标之外工作。具体来说,错误是,

错误:geom_raster仅适用于笛卡尔坐标

有没有更好的方法来执行此任务?

2 个答案:

答案 0 :(得分:1)

我找到了另一种使用ggmap将结果转换为栅格的方法

ggmap(chicago_map) + coord_cartesian() +geom_raster(data=chicago_data, aes(x=longitude,y=latitude,fill=rider_weight,alpha=0.2))

虽然

与geom_tile看起来没有什么不同

答案 1 :(得分:0)

我实际上会将其转换为栅格,为了做到这一点,首先将数据帧转换为空间点对象

library(sp)
library(rgdal)
coordinates(chicago_data)=~longitude+latitude

给它正确的投射

proj4string(chicago_data)=CRS("+init=epsg:4326")
chicago_data = spTransform(chicago_data,CRS("+proj=longlat +datum=WGS84"))
gridded(chicago_data) = TRUE

将其变成光栅

r = raster(chicago_data)
projection(r) = CRS("+proj=longlat +datum=WGS84")

我不确定你是否可以在ggplot2中使用它,但你实际上可以将它绘制为栅格

plot(r)