Edició de mapes estadístics de Catalunya amb R

Pere Millán
5 min readFeb 21, 2021

Aquest article mostra una manera d’editar mapes estadístics amb R a partir de dades descarregades amb l’API d’El municipi en xifres (EMEX) de l’IDESCAT.

Editar mapes amb R i fer-ho a partir de fitxers shape (*.shp) i dades obtingudes via web no és trivial atès que és necessari utilitzar funcions de diversos paquests de R per a dibuixar els contorns geogràfics i assignar a cada unitat geogràfica un valor obtingut de manera dinàmica. A continuació mostro pas a pas com fer un mapa com per exemple el següent:

Figura que obtindrem si tot funciona correctament.

Descàrrega de la base municipal actualitzada

Per a l’elaboració del mapa primer de tot necessitem descarregar els fitxers shape (SHP) de la Base municipal de l’ICGC. Un cop obert l’enllaç podem descarregar-los si cliquem sobre el requadre blau on posa “Descarrega SHP”.

Lloc web de l’ICGC

Un cop descarregat el fitxer *.zip —a dia d’avui es diu bm5mv21sh0tc1_20200601_0.zip però aquest nom va canviant a mesura que s’actualitza la informació— cal descomprimir-lo i desar la carpeta resultant en una ruta coneguda. En aquest cas he desat la carpeta a la ruta ICGC\BASE_MUNICIPAL\bm5mv21sh0tc1_20200601_0 dins del projecte d’RStudio MAPES que s’emmiralla al repositori de GitHub https://github.com/sciencegraph/MAPES. A banda de les capes shape que conté aquesta carpeta de l’ICGC, a la mateixa ruta he desat una capa anomenada Catalunya, construïda a partir de la capa que conté el perímetre de les quatre províncies, amb el perímetre de Catalunya. Si bé aquesta capa no l’he feta servir en aquest mapa, sí que podria ser d’utilitat en altres casos i és per això que l’he considerada tant a la carpeta de capes de base com al script.

Codi de R

Les llibreries que necessitem carregar per a dibuixar el mapa són: ggplot2, rgdal, rgeos, RcolorBrewer i RJSONIO. Cal tenir en compte però que, tot i que no es crida directament, la llibreria sp ha d’estar també actualitzada a la darrera versió.

  • ggplot2 és bàsica per a dibuixar diagrames i, en aquest cas, el mapa.
  • rgdal és necessària per a processar les geometries georeferenciades en format shape (*.shp) que es descarreguen del lloc web de l’ICGC.
  • RcolorBrewer la farem servir per a definir l’escala de colors que codificarà la informació.
  • RJSONIO la necessitem per a processar el fitxer amb format JSON amb què descarregarem les dades de l’API de l’IDESCAT.

library(ggplot2)
library(rgdal)
library(RColorBrewer)
library(RJSONIO)

Un cop carregades les llibreries guardem la ruta on hem desat els fitxers shape de l’ICGC i carreguem aquests fitxers:

# Directori amb el recull de capes actualitzat a 19–02–2021
dsn_basemun <- “ICGC/BASE_MUNICIPAL/bm5mv21sh0tc1_20200601_0”

# Perímetre de comarques
shapefile2 <- readOGR(dsn = dsn_basemun, layer=”bm5mv21sh0tpc1_20200601_0")
shp_com_pol <- fortify(shapefile2, region = “CODICOMAR”)

# Perímetre de municipis
shapefile3 <- readOGR(dsn = dsn_basemun, layer=”bm5mv21sh0tpm1_20200601_0")
shp_mun_pol <- fortify(shapefile3, region = “CODIMUNI”)

Un cop carregats els fitxers *shape* carreguem les dades estadístiques de l’IDESCAT. Cal tenir en compte que els indicadors disponibles a l’EMEX (El Municipi En Xifres) depenen de l’àmbit geogràfic escollit. És a dir en funció de la grandària del municipi la selecció d’indicadors és més amplia. Com no hi ha una llista única d’indicadors, no s’ha previst a l’API una forma d’obtenir la relació exhaustiva.

Una forma d’obtenir la relació més àmplia possible pot consistir en sol·licitar la informació d’un municipi gran, com Barcelona (080193): http://api.idescat.cat/emex/v1/geo/080193.xml

Posem aquesta adreça al navegador web i aquest ens permet veure un fotxer en format JSON en el qual podem veure els diferents estadístics disponibles, en aquest cas, per al municipi de Barcelona. A partir d‘aquest’ fitxer podem escollir un indicador, per exemple el primer, el f271 que fa referència a la superfície en Km2 del municipi.

Carreguem aleshores les dades d’aquest indicador seguint les instruccions de l’API que es poden consultar a https://www.idescat.cat/dev/api/emex/

# Altitud
query1 <- “http://api.idescat.cat/emex/v1/geo.json?i=f271&tipus=cat,mun&lang=en"
parsed.query1 <- RJSONIO::fromJSON(content = query1, encoding = ‘UTF-8’)

Com que les dades georeferenciades les tenim en un data.frame per a unir-les amb les dades estadístiques, és ideal que aquestes també tinguin un format data.frame.

# Estructurem com a data.frame
id <- sapply(parsed.query1$fitxes$cols$col, function(x) x[[2]])
name <- sapply(parsed.query1$fitxes$cols$col, function(x) x[[3]])
observation <- as.numeric(unlist(strsplit(parsed.query1$fitxes$indicadors$i$v[[1]][],
split=”, “)))
df_observation <- data.frame(id, name, observation)

Abans de continuar podem comprovar si tots els registres del data.frame resultant tenen la mateixa jerarquia. En aquest cas, cada registre correspon a un municipi excepte un que correspon a l’estadístic del conjunt de Catalunya. Eliminem aleshores aquest registre a fi de tenir un conjunt de dades millor estructurat.

# Depurem el data

df_observation <- df_observation[df_observation$name != “Catalunya”, ]

Ara que tant la geometria georeferenciada com les dades estadístiques les tenim en format data.frame unim els dos datasets:

# Unió dels dos data.frame
merge.shp.coef <- merge(shp_mun_pol, df_observation, by=”id”, all.x=TRUE)
data_to_plot <- merge.shp.coef[order(merge.shp.coef$order), ]

El data.frame “data_to_plot” és el que farem servir com a font de dades per a la funció ggplot() que graficarà el mapa. Abans però, podem adaptar l’estil de la gràfica al nostre gust modificant l’estil per defecte establert per la llibreria ggplot2 i construir l’escala de color que farem servir per a codificar, en aquest cas, l’altitud de cada municipi.

# Estil personalitzat
theme_set(theme_void())

theme_mapa <- theme(
legend.title = element_text(size = 10),
legend.justification = c(1, 0),
legend.position = c(0.9, 0.1),
text = element_text(family = “Liberation Sans”)
)

#Escala de color personalitzada
myPalette <- colorRampPalette(rev(RColorBrewer::brewer.pal(4, “Spectral”)))

Un cop que tenim el data.frame ambn tota la informació que necessitem, la definició de l’estil que volem i de l’escala cromàtica podem passar a graficar el mapa amb la funció ggplot(). Abans però especifiquem el text que volem que surti al peu de figura i les unitats de mesura de l’estadístic que apareixeran sobre l’escala cromàtica de la llegenda.

peuimatge <- “Superfície en km2 dels municipis. Fonts: ICGC i IDESCAT (EMEX).\nPere Millán-Martínez (2021)”
unitat <- “km2”

ggplot() +
geom_polygon(data=data_to_plot,
aes(x = long, y = lat, group = group, fill = observation),
color = “transparent”, size = 0.1) +
geom_path(data = shp_mun_pol,
aes(x = long, y = lat, group = group),
size = .1, alpha = 0.25) +
geom_path(data = shp_com_pol,
aes(x = long, y = lat, group = group),
size = .2) +
coord_fixed() +
scale_fill_gradientn(colours = myPalette(3),
na.value=”transparent”,
limits=c(0, max(merge.shp.coef$observation, na.rm=TRUE)),
name = unitat) +
labs(caption= peuimatge) +
guides(fill = guide_colorbar(barwidth = unit(2, ‘mm’),
title.theme = element_text(size = 9))) +
theme_mapa

El resultat obtingut és, si tot ha anat bé, el que esperàvem i que apareix al començament de l’article. Per a acabar, un cop tenim l’objecte ggplot graficat, sempre podem recuperar-lo per a desar la imatge en un format determinat.

ggsave(“exemple_mapa.png”,plot = last_plot(), device = “png”)

Recordeu que podeu descarregar-vos aquest projecte de RStudio al lloc web https://github.com/sciencegraph/MAPES

--

--