R spplot标签位于错误的地方

时间:2016-10-18 23:33:03

标签: r plot labels sp

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

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

我需要的标签标识了一个单独的5位多边形区域所属的邮政编码分组。例如 - 对于Ashtabula,OH邮政编码我需要所有的邮政编码在其中间有一个标签,上面写着" 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")

下一步:创建Ashtabula,OH邮政编码的载体:

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)
)

哪个有效,并给出了以下正确的俄亥俄州东北部邮政区域的正确标签:

enter image description here

非常好 - 但是 - 右边的比例看起来像是保留了大量的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的形状是对,标签是正确的......):

enter image description here

现在我需要将PostalGroupNumber标签添加到空间数据框中,并将所有邮政编码组的颜色组合在一起作为每组相同的颜色。所以Ashtabula应该都是一种颜色,并且都有#340; 503&#34;标签 - 但他们没有:

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)
)

现在看起来像这样:

enter image description here

仔细看看Ashtabula(东北角)现在看起来像这样 - 标签上发生了什么?:

enter image description here

标签都错了 - 但是在检查ohzcta5 @数据时,PostalGroupNumber位于正确的GEOID10记录上。

帮助!!!!失去理智。

1 个答案:

答案 0 :(得分:0)

两个问题的答案: 1)通过使用基础包&#34; droplevels&#34;解决了在spplot规模上出现的空间框架中保留的太多级别的问题。对于空间数据框中的每个因素。

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