Introducció

Aquest tutorial ofereix una introducció breu a com fer un mapa amb R. Els materials son només una pinzellada dels temes tractats al mòdul “Mapes i anàlisi espacial” del Postgrau Analista de Dades per a l’Anàlisi Política i la Gestió Pública de la Universitat de Barcelona (UB).

El tutorial té diferents etapes. En primer lloc, obrirem i prepararem les dades. En segon lloc, farem un mapa coroplètic. En tercer lloc, farem un mapa de punts. Finalment, farem un mapa dinàmic.

Per seguir el tutorial convé que us baixeu les dades. Les trobareu aquí. Trobareu tres arxius: a) Un arxiu excel amb els resultats electorals al Parlament de Catalunya del 2017, b) Un arxiu .csv amb informació sobre les fosses comunes a Catalunya, i c) una carpeta amb els arxius shape (mapa de Catalunya a nivell municipal).

Preparació de les bases de dades

El primer pas és obrir la base de dades. L’arxiu l’hem extret de l’Idescat. Conté els resultats electorals de les eleccions al Parlament de Catalunya de l’any 2017.

Obrim la base de dades i l’assignem a un objecte, el qual anomenem df_ele.

library("readxl")
df_ele <- read_excel("cat_2017.xlsx", sheet = "eleccions")

Com podeu veure, hi ha una columna, la primera, que conté el codi únic de cada municipi de Catalunya. Per tal de poder fer la unió entre el mapa i les dades electorals, convé que arreglem aquest codi. Fixeu-vos que hi ha municipis amb un codi amb un dígit menys. A més, com veureu després a l’arxiu espacial, l’Idescat ens dona els codis de municipis amb un dígit més del que necessitem (l’últim dígit).

Per tant, primer afegim un zero al davant del codi únic (d’aquesta manera tots tindran els mateixos dígits). Fixeu-vos també que convertim el codi a format text. Ens facilitarà la unió espacial. Després eliminem l’últim dígit.

library("dplyr")
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library("stringr")
df_ele$codi <- str_pad(df_ele$codi, 6, pad = "0")
df_ele$codi_unic <- substr(df_ele$codi, 1, 5) 

Ara creem una variable que capturi el percentatge de participació en les eleccions a cada municipi català. Abans hem de convertir les variables a tipus numèric.

df_ele <- df_ele %>% 
  mutate(electors = as.numeric(electors),
         votants = as.numeric(votants)) %>% 
  mutate(part = (votants/electors*100) )   

Fem un histograma per visualitzar ràpidament com es distribueix el percentatge de participació–i, de pas, per comprovar que ho haguem fet bé.

hist(df_ele$part) 

Mapa municipal de Catalunya

Per fer un mapa, necessitem un arxiu espacial. Hi ha molts arxius d’aquest tipus, però els més habituals son els coneguts com a shapefiles. Aquest tipus d’arxiu està originalment desenvolupat per la companyia californiana ESRI. En el fons, son dos els arxius que necessitarem. Un arxiu .shp i un arxiu .dbf. És a dir, tot mapa que utilitzi aquest arxiu de format vectorial consta de dos arxius: l’.shp conté el contingut geomètric de l’objecte. El .dbf és la base de dades que emmagatzema la informació dels atributs de l’objecte espacial.

El shapefile dels municipis de Catalunya l’hem extret de l’Institut Cartogràfic i Geològic de Catalunya (ICGC).

Utilitzarem la llibreria sf per obrir-lo.

library("sf")
## Linking to GEOS 3.7.2, GDAL 2.4.2, PROJ 5.2.0
cat <- st_read("shp/Municipis.shp")   
## Reading layer `Municipis' from data source `/Users/rodoncas/G.Drive UPF/Tutorials/Mapes/shp/Municipis.shp' using driver `ESRI Shapefile'
## Simple feature collection with 946 features and 6 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: 17720.01 ymin: 4942225 xmax: 370986 ymax: 5290896
## CRS:            3857

Ara ja podem fer el mapa. Les instruccions son molt semblants a les que fem servir quan utilitzem la llibreria ggplot2.

library("ggplot2")
ggplot(cat) +
  geom_sf()   

Mapa de la participació

Tenim, per tant, dos arxius. Un d’ells, df_ele, és un dataframe amb els resultats electorals. L’altre, cat, és l’arxiu espacial (el “mapa”). Per tal de fer un mapa de la participació electoral, hem d’unir tots dos arxius. Farem una unió espacial (spatial join). La unió es farà via el codi que hem netejat i creat abans.

cat <- cat %>% 
  rename(codi_unic = Codigo) %>% 
  left_join(.,df_ele, by="codi_unic") 

Un cop unides les dades en una única base de dades, ja podem fer el mapa de participació. La llibreria viridis ens permet incloure una paleta de colors que no està originalment inclosa en la llibreria ggplot2. Fixeu-vos que els codis del final inclouen l’escala i una fletxa indicant on és el nord.

library("viridis")
## Loading required package: viridisLite
library("ggspatial")

ggplot(cat) +
  geom_sf(aes(fill = part)) +
  scale_fill_viridis(direction = -1) +
  theme(panel.background = element_blank(),                               
  line = element_blank(),                                                    
axis.text = element_blank(),                                             
axis.title = element_blank(),
legend.position = "bottom",
legend.title=element_blank()) +
  annotation_scale(location = "br", width_hint = 0.3) +
  annotation_north_arrow(location = "br", which_north = "true", 
                         pad_x = unit(0.65, "in"), pad_y = unit(0.4, "in"),
                         style = north_arrow_fancy_orienteering) 

Mapa de punts

Un altre dels mapes habituals és l’anomenat mapa de punts. En aquest cas utilitzarem la base de dades de les Fosses comunes a Catalunya. Tenim un arxiu amb dues columnes que especifiquen, respectivament, la latitud i la longitud. L’arxiu es pot trobar a Dades Obertes de la Generalitat de Catalunya.

Primer importem l’arxiu.

df_fosses <- read.csv("Fosses_comunes_a_Catalunya.csv")

Per poder fer el mapa de Catalunya per municipis i el mapa de fosses convé que els posem en un mateix sistema de coordenades (vegeu aquest tutorial per entendre la importància dels sistemes de coordenades i de la projecció dels mapes).

df_fosses <- st_as_sf(df_fosses, coords = c("Longitud", "Latitud"), 
                  agr = "constant") %>% st_set_crs(4269)

cat <- st_transform(cat, crs = 4269)

Ara ja podem fer el mapa.

ggplot() +
  geom_sf(data=cat, aes(fill = part)) +
  scale_fill_gradientn(colours=rev(cividis(6))) +
  geom_sf(data=df_fosses, color = "red") +
   theme(panel.background = element_blank(),                               
  line = element_blank(),                                                    
axis.text = element_blank(),                                             
axis.title = element_blank(),
legend.position = "bottom",
legend.title=element_blank()) +
  annotation_scale(location = "br", width_hint = 0.3) +
  annotation_north_arrow(location = "br", which_north = "true", 
                         pad_x = unit(0.65, "in"), pad_y = unit(0.4, "in"),
                         style = north_arrow_fancy_orienteering) 

Mapes dinàmics

R ens permet fer moltes altres coses. Per exemple, mapes dinàmics. Hi ha diverses llibreries que ho permeten. Una d’elles és la tmap. Fixeu-vos que, si cliqueu en una fossa comuna, apareix una bombolla amb informació sobre la fossa.

library("tmap")

tmap_mode("view")
## tmap mode set to interactive viewing
tm_shape(cat) +
  tm_fill("part",
          # popup definition
          popup.vars=c(
            "% Participació"="part",
            "Municipi" ="Texto"),
          id = "Municipi"   ) +
  tm_shape(df_fosses) +
  tm_dots(popup.vars=c(
    "Fossa"="Clau",
    "Bandol"="Bandol",
    "TipusFossa"="TipusFossa",
    "NumRestes"="NumRestes"))