使用R中的属性值分布创建热图(不是密度热图)
你们中的一些人可能已经看到了。我面临着一个类似的问题,我想创造一个这样的情节。在我的例子中,我有大量的地理编码观测(超过100万)和一个二进制属性x。我想在地图上显示x的分布,对于p(x=1),颜色比例从0到1不等 我对其他方法持开放态度,但Katz对Beyond“Soda、Pop或Coke”的方法进行了描述,并使用了以下软件包:fields、maps、mapproj、plyr、RANN、RColorBrewer、Scale和zipcode。他的方法依赖于具有高斯核的k-最近邻核平滑。他首先定义了地图上每个位置t到所有观测值的距离,然后使用距离加权估计值p(x=1 | t)(x为1的概率取决于位置)。公式是 当我正确理解这一点时,在R中创建这样的映射涉及以下步骤:使用R中的属性值分布创建热图(不是密度热图),r,ggplot2,maps,heatmap,geor,R,Ggplot2,Maps,Heatmap,Geor,你们中的一些人可能已经看到了。我面临着一个类似的问题,我想创造一个这样的情节。在我的例子中,我有大量的地理编码观测(超过100万)和一个二进制属性x。我想在地图上显示x的分布,对于p(x=1),颜色比例从0到1不等 我对其他方法持开放态度,但Katz对Beyond“Soda、Pop或Coke”的方法进行了描述,并使用了以下软件包:fields、maps、mapproj、plyr、RANN、RColorBrewer、Scale和zipcode。他的方法依赖于具有高斯核的k-最近邻核平滑。他首先定义
# 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)
#获取ROI的边界框并将其转换为列表
bboxROI=apply(bbox(shape),1,as.list)
#在每个维度中创建从最小(x)到最大(x)的序列
seqs=lappy(bboxROI,函数(x)seq(x$min,x$max,by=0.001))
#重命名为xgrid和ygrid
姓名(seqs)我很欣赏你的雄心壮志,也很欣赏你对你的方法的描述,但我注意到你的帖子没有包含任何具体的问题。我已更新了问题,以下是相关补充:“首先,如何通过步骤1解决我的问题?正如下面第二张图所示,我目前的方法失败了。这是一个明确的R实现问题,一旦解决了,我应该能够完成其他步骤。第二,更广泛地说,这是正确的方法,还是您会建议一种不同的方法来创建具有属性值分布的热图?“我只是粗略地看了一下,因为我不熟悉rbind.fill.matrix
,但在我看来,borders
调用中传递多边形的顺序有问题,结果是,当函数从一个多边形移动到另一个多边形时,整个区域不会被点填充。这让我想起了我遇到的问题。对不起,我现在想不出别的了。