我正在尝试使用R中的功能强化来绘制地图。但是我在处理数据时总是遇到错误。我使用以下代码读取形状文件:
shape <- readShapeSpatial("Lond_City/lond_city.shp")
shapefile可以在以下保管箱位置找到: https://www.dropbox.com/sh/d4w6saailydtu1r/5oIa56xV6S
然后我尝试使用以下命令:
shape1 <- fortify(shape,region="data")
在上面的代码中,我应该放置什么“数据”。这个地方似乎令人困惑。我可以在R中打开数据或shapefile。但是,当我运行fortify行时,我收到以下错误:
'[。data.frame'(attr ,, region)中的错误:选择了未定义的列
有人可以告诉我如何使用示例正确强化形状文件吗?我想使用fortify的原因是我想将形状文件与数据点组合在一起。
非常感谢你。
Jdbaba
答案 0 :(得分:11)
您的问题是您需要为fortify
提供实际存在的列。如果您从下面的示例代码中键入str(lon.shape)
,您会看到没有region
列:
> str(lon.shape)
Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
..@ data :'data.frame': 1 obs. of 7 variables:
.. ..$ ons_label: chr "00AA"
.. ..$ name : chr "City of London"
.. ..$ label : chr "02AA"
.. ..$ X_max : num 533843
.. ..$ y_max : num 182198
.. ..$ X_min : num 0
.. ..$ y_min : num 0
..@ polygons :List of 1
.. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
.. .. .. ..@ Polygons :List of 1
.. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
.. .. .. .. .. .. ..@ labpt : num [1:2] 532464 181220
.. .. .. .. .. .. ..@ area : num 3151465
.. .. .. .. .. .. ..@ hole : logi FALSE
.. .. .. .. .. .. ..@ ringDir: int 1
.. .. .. .. .. .. ..@ coords : num [1:771, 1:2] 531027 531029 531036 531074 531107 ...
.. .. .. ..@ plotOrder: int 1
.. .. .. ..@ labpt : num [1:2] 532464 181220
.. .. .. ..@ ID : chr "0"
.. .. .. ..@ area : num 3151465
..@ plotOrder : int 1
..@ bbox : num [1:2, 1:2] 530967 180404 533843 182198
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr [1:2] "x" "y"
.. .. ..$ : chr [1:2] "min" "max"
..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots
.. .. ..@ projargs: chr "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs"
相反,请尝试使用name
,如下所示:
lon.df <- fortify(lon.shape, region = "name")
生成此数据框:
> head(lon.df)
long lat order hole piece group id
1 531026.9 181611.1 1 FALSE 1 City of London.1 City of London
2 531028.5 181611.2 2 FALSE 1 City of London.1 City of London
3 531036.1 181611.5 3 FALSE 1 City of London.1 City of London
4 531074.0 181610.3 4 FALSE 1 City of London.1 City of London
5 531107.0 181609.3 5 FALSE 1 City of London.1 City of London
6 531117.1 181608.9 6 FALSE 1 City of London.1 City of London
这是一种方法,从头到尾:
library(rgdal)
library(ggplot2)
library(rgeos)
shape.dir <- "c:/test/london" # use your directory name here
lon.shape <- readOGR(shape.dir, layer = "lond_city")
lon.df <- fortify(lon.shape, region = "name")
ggplot(lon.df, aes(x = long, y = lat, group = group)) +
geom_polygon(colour = "black", fill = "grey80", size = 1) +
theme()
...导致以下结果:
答案 1 :(得分:2)
您应该label
代替data
。
require(maptools); require(ggplot2)
shape <- readShapeSpatial("Lond_City/lond_city.shp")
shape1 <- fortify(shape,region="label")
为了找到这个,我检查了shape
的数据元素:
> shape@data
ons_label name label X_max y_max X_min y_min
0 00AA City of London 02AA 533842.7 182198.4 0 0
这表明ons_label
或name
也有效,可能更适合您的用途。
请注意,您的形状文件有点不寻常,因为似乎只有一个组。