使用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-最近邻核平滑。他首先定义

你们中的一些人可能已经看到了。我面临着一个类似的问题,我想创造一个这样的情节。在我的例子中,我有大量的地理编码观测(超过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中创建这样的映射涉及以下步骤:

  • 构建覆盖shapefile整个区域的栅格(让我们调用栅格t中的点)。我试着使用polygrid,但到目前为止失败了。代码如下
  • 对于每个t,计算到所有观测值的距离(或者只找到k个clostest点并计算该子集的距离)
  • 根据定义的公式计算p(x=1 | t)
  • 用0到1范围内的适当色标绘制所有t
  • 这里有一些我和两个具体的问题。首先,如何通过步骤1解决我的问题?正如下面第二张图所示,我目前的方法失败了。这是一个明确的R实现问题,一旦解决了,我应该能够完成其他步骤。第二,更广泛地说,这是正确的方法,还是您会建议一种不同的方法来创建具有属性值分布的热图

    加载库并打开形状文件和包

    # 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
    调用中传递多边形的顺序有问题,结果是,当函数从一个多边形移动到另一个多边形时,整个区域不会被点填充。这让我想起了我遇到的问题。对不起,我现在想不出别的了。