2

我正在尝试使用 R 绘制一些土耳其语数据。

我遇到的问题是,当我将数据与形状文件(以空间多边形数据框格式)合并时,数据不再匹配正确的 pologons。我究竟做错了什么,

下面是一些可重现的代码。形状文件是一些自然地球数据(所以公共领域),我把它放在我的谷歌驱动器上,用简单的数据 excel 文件压缩。它在合并之前和之后生成 2 个标有省份名称的地块。您可以看到第二张图像“混乱”了数据,Turkey.map@data 不再匹配正确的多边形。

使用正确的省名合并地块之前: 合并前 合并地块之后: 合并后

library(maptools)
library(readxl)

temp <- "TurkeyShapefile.zip"
URL      <- "https://docs.google.com/ucid=0B0TyKM0aACIONUxfNTJwWGhrR0k&export=download"
download.file(URL,temp, mode="wb")
unzip(temp)

trtr <- readShapeSpatial("Natural_earth_admin_RMS150518_TR")

#read excel file
fname <- "TR_data.xlsx"
TRdata <- read_excel(fname, sheet = "pcnt")

Turkey.map <- trtr       #create copy of trtr

#a plot of the map before the merge
plot(Turkey.map)
invisible(text(getSpPPolygonsLabptSlots(Turkey.map), labels=as.character(Turkey.map@data$Admin1Name), cex=0.5))


#merge (join data)
Turkey.map@data <- merge(Turkey.map@data,TRdata,by.x="Admin1Name",by.y="Province", all.x=TRUE)

#a plot of the map after the merge
plot(Turkey.map)
invisible(text(getSpPPolygonsLabptSlots(Turkey.map), labels=as.character(Turkey.map@data$Admin1Name), cex=0.5))

非常感谢!

4

1 回答 1

1

如果您@data对空间对象上的插槽进行任何操作,并且可以以任何方式对其进行重新排序,那么您将陷入痛苦的世界。通常,您应该通过手动调用which()匹配数据集之间的 ID 字段来完成所有操作,或者在您的情况下,您可以调用merge()对象SpatialPolygonsDataFrame本身:

Turkey.map <- merge(
    Turkey.map, TRdata, 
    by.x="Admin1Name", by.y="Province", 
    all.x=TRUE
)

好奇为什么 OP 没有看到将Spatial*对象与 a合并的正确输出,data.frame这是一个完全可重现的示例,显示了正确的行为:

library(sp)

##  Reproducible 10x10 grid of polygons:
set.seed(2002)
grd <- GridTopology(c(1,1), c(1,1), c(10,10))
polys <- as(grd, "SpatialPolygons")
centroids <- coordinates(polys)
x <- centroids[,1]
y <- centroids[,2]
z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x
d <- SpatialPolygonsDataFrame(
  polys,
  data=data.frame(
    x=x, y=y, z=z, ID=1:length(x), 
    row.names=row.names(polys)
  )
)

df <- data.frame("ID"=1:10, color="black")

class(d)
class(df)

产量:

class(d)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
class(df)
[1] "data.frame"

然后将两者合并:

##  The merge of a SpatialPolygonsDataFrame and a data.frame:
dm <- merge(d, df, by.x="ID", by.y="ID", all.x=T)

##  Verify we still have a Spatial* object:
class(dm)
names(dm)

产量:

class(dm)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
names(dm)
[1] "ID"    "x"     "y"     "z"     "color"

plot(dm, col=dm$color)

在此处输入图像描述

> sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices
[4] utils     datasets  methods  
[7] base     

other attached packages:
[1] sp_1.1-1

loaded via a namespace (and not attached):
[1] tools_3.2.1     grid_3.2.1     
[3] lattice_0.20-31
于 2015-08-12T14:32:15.277 回答