Cartogramas en ggplot2

Librería

cartogram

Autor principal

Sebastian Jeworutzki

Un cartograma es un tipo de mapa donde diferentes áreas geográficas son modificadas en base a una variable asociada a esas áreas. Aunque los cartogramas pueden ser visualmente atractivos, requieren un conocimiento previo de la geografía representada, ya que los tamaños y los límites de las geografías son alterados.

Usaremos los datos incluídos en el paquete mapSpain, que proporciona datos de mapas en formato sf y un conjunto de datos de muestra llamado pobmun19, que incluye la población de España por municipio en 2019.

Mapa base

En primer lugar, necesitamos obtener los datos espaciales que contienen la información geográfica a ser usada en el gráfico. Usando el paquete mapSpain podemos seleccionar las provincias, que son el segundo nivel de división administrativa del país, y visualizar el objeto con geom_sf.

# install.packages("sf")
library(sf)
# install.packages("dplyr")
library(dplyr)
# install.packages("ggplot2")
library(ggplot2)
# install.packages("mapSpain")
library(mapSpain)
# install.packages("cartogram")
library(cartogram)

# Datos
prov <- esp_get_prov() %>%
  mutate(name = prov.shortname.en) %>%
  select(name, cpro)

# Mapa base
ggplot(prov) +
  geom_sf()

Mapa base de España en ggplot2 con el paquete mapSpain

Proyección

Vamos a usar el paquete cartogram, que es específico para esta tarea. Dado que cartogram requiere un objeto sf proyectado, vamos a proyectar nuestro mapa en la conocida proyección Mercator (EPSG code: 3857).

Mapa de España con la proyección Mercator. EPSG code: 3857

# Transform the shape
prov_3857 <- st_transform(prov, 3857)

ggplot(prov_3857) +
  geom_sf()

Unir los datos y el mapa

Para crear un cartograma tendremos que unir los datos estadísticos con los geográficos. Para ello, dado que los objetos sf se comportan como data frames, podemos usar la función left_join de dplyr. Como el conjunto de datos pobmun19 proporciona datos a nivel municipal, primero tenemos que agregarlos a nivel provincial:

# Agregar
pob_provincias <- mapSpain::pobmun19 %>%
  group_by(cpro) %>%
  summarise(n_pop = sum(pob19))

prov_3857_datos <- prov_3857 %>%
  left_join(pob_provincias, by = c("cpro"))

Después de unir los conjuntos de datos tendremos un objeto con los datos de mapSpain::pobmun19 junto con una columna llamada geometry, que incluye los datos de las coordenadas geográficas.