我有一个显示澳大利亚偏远地区的形状文件,来自澳大利亚统计局:
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"
我唯一要做的就是绘制地图!这是我被困的地方......
ra@polygons
是一个包含35个多边形的列表,每个多边形都有一个插槽ID
,它是数据框ra@data
的索引。所以我要做的就是告诉plot()
找到ra@data$COLOUR[ID]
中的颜色。嗯,不太好。 35个多边形(“多边形”类)中的每一个都有自己的多边形列表(“Polygon”类);总共有6902个多边形!!!
我对plot()
的理解是,我必须以与绘制多边形相同的顺序传递颜色矢量。因此,我相信我必须创建一个长度为6902的向量,每个元素保存相关多边形的颜色值。到目前为止我该怎么做?
如果按顺序绘制多边形,那就很容易了,但事实并非如此。 35个多边形中的每一个都有一个槽plotOrder
,它是一个整数向量,因此颜色向量可能必须按照这些向量中的每个值排序。
此时这一切似乎有点过于复杂。我完全偏离了这里吗?
感谢您的建议!
答案 0 :(得分:11)
你已经完成了所有的工作!
plot(ra, col=ra@data$COLOUR)
甚至,正如@Spacedman建议的那样:
plot(ra, col=ra$COLOUR)
那就是它!
如果你想摆脱多边形边界:
plot(ra, col=ra$COLOUR, border=NA)
修改:尝试解释此行为:
根据?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, ...)
}
...
输入到col
的向量具有与polygons
时隙相同的顺序,因此具有ID。 plotOrder
用于以相同的方式为所有这些索引编制索引。