有些人可能见过Beyond "Soda, Pop, or Coke"。我正面临着类似的问题,并希望创建一个这样的情节。就我而言,我有大量的地理编码观测值(超过100万)和二进制属性 x 。我想在地图上显示 x 的分布,对于p(x = 1),色度范围从0到1。
我对其他方法持开放态度,但Katz的 Beyond“Soda,Pop或Coke”的方法被描述为here并使用这些包:字段,地图,mapproj,plyr,RANN ,RColorBrewer,音阶和邮政编码。他的方法依赖于k-最近邻核平滑与高斯核。他首先将地图上每个位置 t 的距离定义为所有观测值,然后对 p(x = 1 | t)使用距离加权估计(x的概率)是1条件的位置)。公式为here。
当我理解这一点时,在R中创建这样的地图涉及以下步骤:
polygrid
尝试this approach但到目前为止失败了。代码如下。这是一些example data和我的两个具体问题。首先,如何通过第1步解决我的问题?如下面的第二张图所示,我当前的方法失败了。这是一个明确的R实现问题,一旦解决了,我应该能够完成其他步骤。第二个也是更广泛地说,是正确的方法还是你会建议一种不同的方法来创建具有属性值分布的热图?
加载库并打开shapefile和包
# set path
path = PATH # CHANGE THIS!!
# load libraries
library("stringr")
library("rgdal")
library("maptools")
library("maps")
library("RANN")
library("fields")
library("plyr")
library("geoR")
library("ggplot2")
# open shapefile
map.proj = CRS(" +proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs +ellps=GRS80 +towgs84=0,0,0")
proj4.longlat=CRS("+proj=longlat +ellps=GRS80")
shape = readShapeSpatial(str_c(path,"test-shape"),proj4string=map.proj)
shape = spTransform(shape, proj4.longlat)
# open data
df=readRDS(str_c(path,"df.rds"))
绘图数据
# plot shapefile with points
par (mfrow=c(1,1),mar=c(0,0,0,0), cex=0.8, cex.lab=0.8, cex.main=0.8, mgp=c(1.2,0.15,0), cex.axis=0.7, tck=-0.02,bg = "white")
plot(shape@bbox[1,],shape@bbox[2,],type='n',asp=1,axes=FALSE,xlab="",ylab="")
with(subset(df,attr==0),points(lon,lat,pch=20,col="#303030",bg="#303030",cex=0.4))
with(subset(df,attr==1),points(lon,lat,pch=20,col="#E16A3F",bg="#E16A3F",cex=0.4))
plot(shape,add=TRUE,border="black",lwd=0.2)
1)构建覆盖shapefile整个区域的网格
# get the bounding box for ROI an convert to a list
bboxROI = apply(bbox(shape), 1, as.list)
# create a sequence from min(x) to max(x) in each dimension
seqs = lapply(bboxROI, function(x) seq(x$min, x$max, by= 0.001))
# rename to xgrid and ygrid
names(seqs) <- c('xgrid','ygrid')
# get borders of entire SpatialPolygonsDataFrame
borders = rbind.fill.matrix(llply(shape@polygons,function(p1) {
rbind.fill.matrix(llply(p1@Polygons,function(p2) p2@coords))
}))
# create grid
thegrid = do.call(polygrid,c(seqs, borders = list(borders)))
# add grid points to previous plot
points(thegrid[,1],thegrid[,2],pch=20,col="#33333333",bg="#33333333",cex=0.4)