使用R(不是密度热图)中的属性值分布创建热图

时间:2013-06-10 13:38:32

标签: r ggplot2 maps heatmap geor

有些人可能见过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中创建这样的地图涉及以下步骤:

  1. 构建覆盖shapefile整个区域的网格(让我们调用网格中的点 t )。我使用polygrid尝试this approach但到目前为止失败了。代码如下。
  2. 对于每个 t ,计算到所有观测值的距离(或者只找到k个最近点并计算该子集的距离)
  3. 根据定义的公式here计算 p(x = 1 | t)
  4. 使用适当的颜色范围绘制所有 t ,范围从0到1
  5. 这是一些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)
    

    enter image description here

    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)
    

    enter image description here

0 个答案:

没有答案