R - 使用plot() - 基于槽值着色shapefile多边形

Mic*_*nry 7 r geospatial shapefile

我有一个显示澳大利亚偏远地区的形状文件,来自澳大利亚统计局:

http://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/1270.0.55.005July%202011?OpenDocument

在同一个URL是PDF"ASGS Remoteness Structure Edition 2011 PDF Maps" - 我试图从这个PDF文档重现第一张地图.

我已经在shapefile中读到并向data插槽添加了颜色信息:

ra <- readShapeSpatial("RA_2011_AUST", delete_null_obj = TRUE)
ra@data$COLOUR <- "#FFFFFF"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 0] <- "#006837"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 1] <- "#31A354"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 2] <- "#78C679"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 3] <- "#C2E699"
ra@data$COLOUR[(as.numeric(as.character(ra@data$RA_CODE11)) %% 10) == 4] <- "#FFFFCC"
Run Code Online (Sandbox Code Playgroud)

我唯一要做的就是绘制地图!这是我被困的地方......

ra@polygons是一个包含35个多边形的列表,每个多边形都有一个槽ID,它是数据帧的索引ra@data.所以我要做的就是告诉我plot()找到颜色ra@data$COLOUR[ID].嗯,不太好.35个多边形("多边形"类)中的每一个都有自己的多边形列表("Polygon"类); 总共有6902个多边形!!!

我的理解plot()是,我必须以与绘制多边形相同的顺序传递颜色矢量.因此,我相信我必须创建一个长度为6902的向量,每个元素保存相关多边形的颜色值.我到目前为止怎么样?

如果按顺序绘制多边形,那将很容易,但它们不是.35个多边形中的每一个都有一个plotOrder整数向量的槽,因此颜色向量可能必须按照这些向量中的每个向量的顺序排序.

在这一点上,这一切似乎有点过于复杂.我完全偏离了这里吗?

谢谢你的建议!

pla*_*pus 12

你已经完成了所有的工作!

plot(ra, col=ra@data$COLOUR)
Run Code Online (Sandbox Code Playgroud)

甚至,正如@Spacedman建议的那样:

plot(ra, col=ra$COLOUR)
Run Code Online (Sandbox Code Playgroud)

就是这样!

在此输入图像描述

如果你想摆脱多边形边界:

plot(ra, col=ra$COLOUR, border=NA)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:尝试解释此行为:

根据?SpatialPointsDataFrame:

具有默认ID匹配的SpatialPolygonsDataFrame将根据多边形ID槽检查数据框行名称.然后它们必须彼此一致,并且是唯一的(没有多边形对象可以共享ID); 如果需要匹配多边形ID,数据框行将被重新排序.

这意味着多边形根据其ID排序,因此按照插槽中数据帧的行的顺序排列@data.

现在,如果你看一下函数plot.SpatialPolygons(使用getAnywhere(plot.SpatialPolygons)),那么在某些时候会有这些行:

...
    polys <- slot(x, "polygons")
    pO <- slot(x, "plotOrder")
    if (!is.null(density)) {
        if (missing(col)) 
            col <- par("fg")
        if (length(col) != n) 
            col <- rep(col, n, n)
        if (length(density) != n) 
            density <- rep(density, n, n)
        if (length(angle) != n) 
            angle <- rep(angle, n, n)
        for (j in pO) .polygonRingHoles(polys[[j]], border = border[j], 
            xpd = xpd, density = density[j], angle = angle[j], 
            col = col[j], pbg = pbg, lty = lty, ...)
    }
...
Run Code Online (Sandbox Code Playgroud)

输入的向量col具有与polygons时隙相同的顺序,因此具有ID.plotOrder用于以相同的方式索引所有这些.

  • 只是`ra $ COLOUR`应该可以工作 - 空间数据框的工作方式大多就像数据帧,除非他们不... (2认同)