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 incluidos 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

# Cambiar el CRS
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.

Creando y personalizando cartogramas en ggplot2

Como resultado del proceso anterior, tenemos un objeto sf con los datos estadísticos a ser dibujados. Podemos proceder ahora a crear un cartograma contiguo con ggplot2, cartogram y sf, usando el objeto sf modificado y pasando la variable de interés (columna n_pop) al argumento weight de la función cartogram_cont:

Cartograma contiguo por defecto en ggplot2

Cartograma contiguo

prov_3857_datos_cartog_cont <- 
  cartogram_cont(prov_3857_datos,
                 weight = "n_pop")

ggplot(prov_3857_datos_cartog_cont) +
  geom_sf()

Cartograma en ggplot2 con regiones coloreadas en base a una variable

Colores por defecto

Si pasas la variable de interés al argumento fill de aes puedes colorear las regiones por color en base a esa variable.

ggplot(prov_3857_datos_cartog_cont) +
  geom_sf(aes(fill = n_pop))

Personalizar los bordes y la paleta de colores de un cartograma contiguo en ggplot2

Personalización de los colores

Ten en cuenta que puedes especificar una paleta de colores personalizada utilizando scale_fill_gradientn o una función equivalente y cambiar los colores de los bordes con el argumento color de la función geom_sf.

ggplot(prov_3857_datos_cartog_cont) +
  geom_sf(aes(fill = n_pop), color = "gray30") +
  scale_fill_gradientn(colours = heat.colors(n = 10,
                                             alpha = 0.5,
                                             rev = TRUE))

Por último, podemos crear un cartograma avanzado mejorando la leyenda con una función de etiquetado y modificando algunos componentes del tema y la leyenda.

Cartograma contiguo en ggplot2 con el paquete cartogram

# Función de etiquetado
label_fun <- function(breaks) {
  labels <- breaks / 1000000
  return(labels)
}

ggplot(prov_3857_datos_cartog_cont) +
  geom_sf(aes(fill = n_pop), color = "gray30") +
  scale_fill_gradientn(
    colours = hcl.colors(3, "GnBu", rev = TRUE),
    labels = label_fun,
    n.breaks = 15,
    guide = guide_colorsteps(
      barwidth = 15,
      barheight = 0.5,
      title = "millones",
      title.position = "right",
      title.vjust = 0.1)) +
  theme_void() +
  theme(legend.position = "top",
        legend.margin = margin(t = 10, b = 2),
        legend.title = element_text(size = 7),
        legend.text = element_text(angle = 45,
                                   margin = margin(t = 5))) +
  labs(title = "España: Población por provincia",
       subtitle = "(censo 2019)")

Otros tipos de cartogramas

Hasta ahora, el tipo de cartograma producido ha sido un cartograma contiguo, donde las geografías se deforman mientras que se mantienen los límites adyacentes. Sin embargo, existen otras clases de cartogramas que se pueden crear con el paquete cartogram.

Cartogramas no-contiguos

Este tipo de cartogramas reduce o incrementa las geografías en base a un valor dado. Si bien no hay deformación de la geometría de la geografía, los tamaños se modifican dejando espacios entre ellos.

Para crear un cartograma no contiguo puedes transformar el conjunto de datos prov_3857_datos haciendo uso de la función cartogram_ncont y pasando la variable de interés (columna n_pop) al argumento weight.

prov_3857_datos_cartog_ncont <- 
  cartogram_ncont(prov_3857_datos,
                  weight = "n_pop")

ggplot(prov_3857_datos_cartog_ncont) +
  geom_sf()

Cartograma no contiguo básico en R

De manera similar al cartograma avanzado de la sección anterior, si quieres crear un cartograma no contiguo más atractivo puedes personalizar la leyenda, el tema y otros componentes estéticos.

ggplot(prov_3857_datos_cartog_ncont) +
  geom_sf(aes(fill = n_pop), color = "gray30") +
  scale_fill_gradientn(
    colours = hcl.colors(n = 3, "ag_Sunset", rev = TRUE),
    labels = label_fun,
    n.breaks = 15,
    guide = guide_colorsteps(
      barwidth = 15,
      barheight = 0.5,
      title = "millones",
      title.position = "right",
      title.vjust = 0.1)) +
  theme_void() +
  theme(legend.position = "top",
        legend.margin = margin(t = 10, b = 2),
        legend.title = element_text(size = 7),
        legend.text = element_text(angle = 45,
                                   margin = margin(t = 5))) +
  labs(title = "España: Población por provincia",
       subtitle = "(censo 2019)")

Cartograma no contiguo en ggplot2 con el paquete cartogram

Cartogramas de Dorling

Este tipo de cartograma sustituye la geografía original con un símbolo (por lo general un círculo) con su tamaño reducido o incrementado en base al valor a ser representado:

Por defecto

Para crear un cartograma de Dorling en ggplot2 pasa el conjunto de datos prov_3857_datos a la función cartogram_dorling y pasa el nombre de la variable de interés al argumento weight.

prov_3857_datos_cartog_dorling <-
  cartogram_dorling(prov_3857_datos,
                    weight = "n_pop")

ggplot(prov_3857_datos_cartog_dorling) +
  geom_sf()

Cartograma de Dorling básico en ggplot2

Cartograma de Dorling avanzado

ggplot(prov_3857_datos_cartog_dorling) +
  geom_sf(aes(fill = n_pop), color = "grey50") +
  scale_fill_gradientn(
    colours = hcl.colors(3, "Zissou 1", rev = TRUE),
    labels = label_fun,
    n.breaks = 15,
    guide = guide_colorsteps(
      barwidth = 15,
      barheight = 0.5,
      title = "millones",
      title.position = "right",
      title.vjust = 0.1)) +
  theme_void() +
  theme(legend.position = "top",
        legend.margin = margin(t = 10, b = 2),
        legend.title = element_text(size = 7),
        legend.text = element_text(angle = 45,
                                   margin = margin(t = 5))) +
  labs(title = "España: Población por provincia",
       subtitle = "(censo 2019)")

Cartograma de Dorling en ggplot2 con la función cartogram_dorling

También te puede interesar