jueves, 8 de marzo de 2012

El mapa de Barcelona

Hace ya días que tenía ganas de publicar este mapa. En realidad desde que vi el mapa de Berlín o esta infografía del New York Times o los mapas de Oscar Perpiñán Lamigueiro.

Bueno, pues sin intentar ser tan espectacular, ya que no tengo los conocimientos suficientes, vamos a explicar de forma sencilla cómo se puede utilizar el mapa de Barcelona o de cualquier otra ciudad, región o estado.

En primer lugar debemos obtener el mapa propiamente dicho. En el caso de Barcelona nos vamos al Geoportalbcn del Ayuntamiento de Barcelona y concretamente a la pestaña de descargas. Allí nos podemos descargar varios archivos en diferentes formatos. A nosotros nos interesan los archivos de las Divisiones administrativas en formato SHP (ESRI shapefile). Estas divisiones administrativas son de diversos tipos: distritos, barrios, secciones censales,... Para trabajar con pocos datos tomaremos como unidades los 10 distritos. De modo que descomprimimos el archivo y nos preparamos para su lectura en R con la carga de algunos paquetes.

library(sp)
library(rgdal)
library(classInt)
library(RColorBrewer)

setwd("~/R/DIVADM_SHP")
ogrInfo(".", "BCN_Districte_SHP")

Para utilizar el paquete rgdal es preciso disponer de los programas adecuados que en linux se instalan con la siguiente instrucción:

$ sudo apt-get install libgdal1-dev libproj-dev

Las siguientes instrucciones leen el mapa y nos informan de su contenido:

ogrInfo(".", "BCN_Districte_SHP")
map.bcn <- readOGR(".",layer="BCN_Districte_SHP")
names(map.bcn)

En particular, los nombres de los distritos no son correctos seguramente por problemas de codificación, luego hay que arreglarlo:

map.bcn$NDistric <- c("Ciutat Vella","Eixample",
"Sants-Montjuïc",

"Les Corts", "Sarrià-Sant Gervasi", "Gràcia",
"Horta-Guinardó", "Nou Barris", "Sant Andreu",
"Sant Martí")

Ahora necesitamos una variable con los datos que queremos representar: demográficos, políticos,...
En este caso vamos a utilizar la proporción de mujeres en cada distrito ya que son datos incluidos en el propio archivo que hemos leído, pero que conste que podemos utilizar cualquier vector de datos, tantos como unidades territoriales.

plot_var <-
map.bcn@data[, "Dones"]/(map.bcn@data[,"Dones"]+map.bcn@data[,"Homes"])


A continuación preparamos los intervalos y los colores:

cuts <- 8
plot_pal <- brewer.pal(cuts, "Purples")
plot_intvl <- classIntervals(plot_var, cuts, style="pretty")
plot_colors <- findColours(plot_intvl, plot_pal)

y ya podemos dibujar el mapa:

plot(map.bcn, col=plot_colors, border="black")
title("Percentatge de dones a Barcelona")
text(map.bcn$Coord_X,map.bcn$Coord_Y,map.bcn$NDistric)

Finalmente podemos añadir la leyenda:

plot_lbls <- paste(round(100*plot_intvl$brks, 0), "%", sep="")[seq(2, length(plot_intvl$brks)-1)]
plot_lbls <- c(
paste("menys del", head(plot_lbls[1],1)),
paste(head(plot_lbls,-1), "-", tail(plot_lbls,-1)),
paste("més del", tail(plot_lbls,1))
)
legend("bottomright",
legend=plot_lbls, fill=attr(plot_colors, "palette"),
bty="n", border=attr(plot_colors, "palette"), cex=0.9
)


Referencias

http://www.nceas.ucsb.edu/scicomp/usecases/ReadWriteESRIShapeFiles


Maps with R de Oscar Perpiñán