Rcoster Rcoster - 3 months ago 18
R Question

How keep information from shapefile after fortify()

How can I keep polygons's information after shapefile? Let me try to explain:

I have a shapefile with this data:

> head(mapa@data)
ID CD_GEOCODI TIPO CD_GEOCODB NM_BAIRRO CD_GEOCODS NM_SUBDIST CD_GEOCODD NM_DISTRIT CD_GEOCODM NM_MUNICIP NM_MICRO NM_MESO
12228 33679 431490205000133 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12229 33680 431490205000134 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12230 33681 431490205000135 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12231 33682 431490205000136 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12232 33683 431490205000137 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE
12233 33684 431490205000138 URBANO 431490205003 Cidade Baixa 43149020500 <NA> 431490205 PORTO ALEGRE 4314902 PORTO ALEGRE PORTO ALEGRE METROPOLITANA DE PORTO ALEGRE


and this data:

> head(data)
CD_GEOCODI Population
1 431490205000133 1272
2 431490205000134 822
3 431490205000135 1085
4 431490205000136 1454
5 431490205000137 964
6 431490205000138 834


I could just merge
data
and
mapa@data
and plot it with
plot()
, but I want use ggplot2. But
fortify()
's output donsn't have any of originals variables. For example:

> head(fortify(mapa))
Regions defined for each Polygons
long lat order hole piece group id
1 -51.22254 -30.03526 1 FALSE 1 12228.1 12228
2 -51.22332 -30.03648 2 FALSE 1 12228.1 12228
3 -51.22365 -30.03702 3 FALSE 1 12228.1 12228
4 -51.22482 -30.03610 4 FALSE 1 12228.1 12228
5 -51.22488 -30.03606 5 FALSE 1 12228.1 12228
6 -51.22476 -30.03591 6 FALSE 1 12228.1 12228


Both (fortify and mapa@data) have an id variable, but aren't the same values. So, again, my question is: How can I pass
mapa@data
's information to
fortify()
's output (or another function that allows use ggplot2)

Answer

Since you did not provide your shapefile or data, it's impossible to test, but something like this should work:

# not tested...
library(plyr)      # for join(...)
library(rgdal)     # for readOGR(...)
library(ggplot2)   # for fortify(...)

mapa <- readOGR(dsn=".",layer="shapefile name w/o .shp extension")
map@data$id <- rownames(mapa@data)
mapa@data   <- join(mapa@data, data, by="CD_GEOCODI")
mapa.df     <- fortify(mapa)
mapa.df     <- join(mapa.df,mapa@data, by="id")

ggplot(mapa.df, aes(x=long, y=lat, group=group))+
  geom_polygon(aes(fill=Population))+
  coord_fixed()
Comments