【问题标题】:R spplot labels in wrong placesR spplot标签在错误的地方
【发布时间】:2017-02-28 09:43:10
【问题描述】:

我正在使用公开可用的美国人口普查地名录数据文件 (zcta5)。我正在使用的版本具有名为 tl_2015_us_zcta510.shp、dbf 的文件...绘制文件工作正常。

当我使用大量多边形对 SpatialDataPolygonsDataFrame 进行子集化时,我遇到的问题似乎发生了。但是当我使用一个小子集时,标签可以正常工作。

我需要的标签用于标识单个 5 位多边形区域所属的已分配邮政编码分组。例如 - 对于阿什塔布拉,俄亥俄州的邮政编码,我需要所有的邮政编码在中间有一个标签,上面写着“503”。我有所有其他俄亥俄州邮政编码分组的标签 - 称为“PostalGroupNumber”,并以表格形式显示所有数据均正确无误。

所以我加载库并将完整的空间数据框读入内存:

library(sp)
library(maps)
library(mapdata)
library(maptools)
library(foreign)

#Load in the entire census gazatteer data file
zcta5=readShapeSpatial("~/R/PostalCodes/USA/US Postal Codes/ZCTA5/tl_2015_us_zcta510.shp")

下一步:创建俄亥俄州阿什塔布拉邮政编码的向量:

ashtab.zips <- c("44003","44004","44005","44010","44030","44032","44041","44047","44048","44068","44076","44082","44084","44085","44088","44093","44099")

下一步 - 子集 zcta5 空间数据框仅包含这些邮政编码:

ashtab <- zcta5[which(zcta5@data$GEOID10 %in% ashtab.zips),]

下一步 - 为新的 ashtab 空间数据框添加标签并绘制:

ashtab@data <- cbind(ashtab@data, "PostalGroupNumber"="503")
l1 = list("sp.text", coordinates(ashtab), as.character(ashtab@data$PostalGroupNumber),col="black", cex=0.7,font=2)
spplot(ashtab,zcol="GEOID10", sp.layout=list(l1)
       ,main=list(label="PostalGroupNumber 503 Postal Areas",cex=2,font=1)
)

这有效并给出了俄亥俄州东北部邮政区域的以下正确图,其中包含正确的标签:

相当不错 - 但是 - 右侧的比例看起来保留了大量的 GEOID10 级别,我预计只有 ashtab.zips 向量中的 17 个级别的子集。附带问题(加分 ;-)- 为什么这些级别仍然存在?

现在谈谈主要问题。俄亥俄州的邮政编码都以 43... 或 44... 开头 - 我有一个 csv 文件,其中仅包含俄亥俄州的 5 位代码,每个代码都有分配的 PostalGroupNumber,我将其读入数据框,清理并像我上面那样使用子集主数据框:

oh <- read.csv("~/R/PostalCodes/OhioPostalGroupings/OH-PGAs-PostalCodes Only.csv", header = TRUE, stringsAsFactors = FALSE, colClasses = c("character", "character", "character"))
oh$ZIP_CODE <- trimws(oh$ZIP_CODE)
ohzcta5 <- zcta5[which(zcta5@data$GEOID10 %in% oh$ZIP_CODE),]
l1 = list("sp.text", coordinates(ohzcta5), as.character(ohzcta5@data$GEOID10),col="black", cex=0.7,font=2)

spplot(ohzcta5,zcol="GEOID10", sp.layout=list(l1)
       ,main=list(label="Ohio Postal Code - PostalGroupNumbers",cex=2,font=1)
)

这一次 - 只需使用 GEOID10 值的标签进行绘图,看看它是否正确绘制 - 在这里很难阅读,但放大显示每个多边形中的正确邮政编码(这不是一个很好的图像,但 OH 的形状是正确,标签正确...):

现在我需要将 PostalGroupNumber 标签添加到空间数据框中,并制作一个因素,将所有邮政编码组一起着色为每组相同的颜色。所以 Ashtabula 应该都是一种颜色,并且都有“503”标签 - 但它们没有:

ohzcta5@data <- merge(ohzcta5@data, oh, by.x="GEOID10", by.y="ZIP_CODE", all.x=TRUE)
ohzcta5@data <- cbind(ohzcta5@data, "TAcolor"=as.factor(ohzcta5@data$PostalGroupNumber))
l1 = list("sp.text", coordinates(ohzcta5), as.character(ohzcta5@data$PostalGroupNumber),col="black", cex=0.7,font=2)

spplot(ohzcta5,zcol="GEOID10", sp.layout=list(l1)
       ,main=list(label="Ohio Postal Code - PostalGroupNumber",cex=2,font=1)
)

现在看起来像这样:

仔细观察 Ashtabula(东北角)现在看起来像这样 - 标签怎么了?:

标签都是错误的——但在检查 ohzcta5@data 时,PostalGroupNumber 位于正确的 GEOID10 记录上。

帮助!!!!失去理智。

【问题讨论】:

    标签: r plot labels sp


    【解决方案1】:

    回答两个问题: 1) 通过对空间数据框中的每个因子使用基础包“droplevels”解决了spplot尺度上出现的空间框架中保留的级别过多的问题。

    2) 不要使用“合并”,因为它会重新排序数据,使其不再与正确的多边形对齐。而是使用本文https://stackoverflow.com/a/3652472/4017087中所示的“匹配”(感谢Ramnath!)

    【讨论】:

    • 感谢您解决了自己的问题!通常建议直接分配 @data 插槽,除非您知道自己在做什么,因为您确定的原因。包 sp 有一个用于空间对象的 merge 方法,您也可以尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2021-10-14
    • 2018-01-17
    • 2020-04-17
    相关资源
    最近更新 更多