Mapas de coropletas, cartogramas y mapas animados con R

Como ya veníamos viendo en otros artículos, las posibilidades para trabajar con datos espaciales en R son enormes y van en aumento. Entre todas estas posibilidades, está la creación de mapas de cartogramas,  coropletas y mapas animados con R:

  • Un cartograma es un mapa que muestra datos cuantitativos asociados a áreas mediante la modificación de los tamaños de las unidades de enumeración.
  • Un mapa coroplético es un mapa temático en el que las áreas de las unidades de enumeración se colorean, generalmente de la misma gama cromática, en función de datos cuantitativos asociados a unidades de enumeración.

Mientras escribo este artículo, el mundo se encuentra sumergido en una pandemia global de COVID-19, causada por el virus SARS-Cov2. Con el objetivo de concienciarnos de la repercusión de estos hechos, me ha parecido buena idea utilizar R como herramienta para mostrar la evolución de las estadísticas obtenidas en los últimos días en España. Y, de paso, animar a los lectores de MappingGIS a seguir el tutorial con estos mismos datos o información de sus países.

mapas animados con R

A modo de resumen, a lo largo de este artículo, vamos a mostrar cómo crear una animación GIF a partir de un mapa de coropletas y cartogramas empleando paquetes de R, utilizando información estadística recopilada sobre el COVID-19 como la que se muestra a continuación.

cov19_animate

1. Librerías

A lo largo de este artículo se van a emplear las siguientes paquetes de R:

  • sf para la lectura y manipulación de datos espaciales.
  • ggplot2 para la visualización/generación de mapas con los resultados.
  • cartogram para la construcción de cartogramas.
  • magick y purr para la creación de una animación GIF.

Lo ideal es descargar aquellos paquetes que no tengamos en nuestro equipo y cargarlos al inicio de nuestra sesión en R:

# Instalación de paquetes
install.packages("ggplot2", "sf", "cartogram", "magick", "purrr")

# Carga de paquetes
library(ggplot2)
library(sf)
library(cartogram)
library(magick)
library(purrr)

2. Adquisición de datos

Obtener datos detallados y precisos sobre la epidemia COVID-19 de determinados países no resulta una tarea sencilla. Se puede intentar obtener datos actualizados de las páginas web nacionales de los países afectados. Algunas urls dónde hay información disponible son:

Para el caso de España, he obtenido la información sobre el número de contagiados en las Comunidades de España desde el pasado Lunes 09 de Marzo hasta este mismo domingo 15 de Marzo, del Centro de Coordinación de Alertas y Emergencias Sanitarias del Ministerio de Sanidad, que ha publicado informes diarios con un resumen epidemiológico de casos confirmados y fallecimientos notificados cada día. Podemos acceder a ellos a través de la siguiente url.

Además, también necesitaremos la cartografía sobre las unidades de enumeración para nuestros mapas. Para este artículo, voy a emplear como unidades de enumeración las provincias de España, que pueden descargarse a través del Centro de Descargas del Centro Nacional de Información Geográfica.

En el caso de otros países, podemos buscar esta información en Catálogos de Datos Abiertos o mediante el paquete de R maptools, que proporciona los límites de varios países de continentes del mundo en el objeto wrld_simpl.

# Paquete maptools
install.packages("maptools")
library(maptools)

# Acceso a datos
data(wrld_simpl)

* Lo ideal es guardar toda la información que vayamos a utilizar en el directorio de trabajo activo en R.

Siguiendo con el tutorial, tras descargar los datos de los límites provinciales de España, se han cargado en R empleado la librería sf.

# Se cargan las unidades de enumeración
prov <- st_read('Comunidades_Autonomas_ETRS89_30N.shp')
plot(st_geometry(prov))

Se puede leer más sobre la librería sf en el artículo R y Gis: Qué es R y su relación con los GIS.

Los datos estadísticos con los que generaremos los mapas también deben estar disponibles en nuestra sesión de R. Para el ejemplo, como comentaba anteriormente, he recopilado la información sobre los contagios desde el 09 de Marzo hasta el 15 de Marzo y la he plasmado en un fichero csv. Podemos cargar los datos de este fichero con la función read.csv de R:

# Lectura de datos sobre contagios
contagios <- read.csv("datos_cov19.csv", header=TRUE, sep=";")
contagios

mapas animados con R contagios

Además, para facilitar la representación de los datos, he juntado los datos estadísticos junto con las geometrías de cada provincia en un único objeto espacial.

# Unión de datos
datos_cov19 <- merge(prov, contagios, by.x = "COD_PROV", by.y="COD_PROV")

3. Generación de mapa de coropletas

Para generar nuestra animación GIF, vamos a generar 7 mapas. Partiremos de un mapa de coropleta dónde no tengamos la geometría distorsionada e iremos generando un mapa de cartograma por día con sus datos correspondientes.

Podemos crear un mapa coroplético empleando el paquete ggplot2. Este paquete de R ofrece un sistema para crear gráficos basado en el libro The Grammar of Graphics. En artículos anteriores, ya habíamos mostrado cómo crear un mapa con esta librería empleando la función ggplot.

# Generación de mapa inicial de cloropetas. Día 09/03/2020
gg09 <- ggplot(data = datos_cov19) +
  geom_sf(aes(fill=D09), data = datos_cov19, color='gray', size=0.3) +
  guides(fill=guide_colorbar(title = "09/03/2020")) +
  scale_fill_gradient(limits= c(0,3600), high = "#e34a33", low = "#fee8c8", guide = "colorbar") +
  xlab("Longitud") + ylab("Latitud") +
  ggtitle("COV-19 en España",
          subtitle = "Datos:09/03/2020") + 
  theme(plot.title = element_text(family="Comic Sans MS", face="bold"),
        legend.position = "left")
gg09

Además, podemos guardar los mapas que generemos mediante la función ggsave().

# Guardar imagen en formato PNG
ggsave(gg09, filename = "mapas/cov19_09_03_2020.png", width = 8,height=8,dpi = 150)

4. Generación de cartogramas

En R, el paquete cartogram es una potente herramienta para la construcción de cartogramas. Esta librería da acceso a la función cartogram_cont(), que necesita un objeto espacial como entrada, junto con el nombre de la variable que se usará para distorsionar la forma de la región y permite emplear una serie de parámetros optativos para alterar los resultados.

# Generación de cartograma. Día 10/03/202
dia10 <- cartogram_cont(datos_cov19, "D10", itermax = 4, threshold = 0.1)

mapas animados con R cov19_09_03_2020

Podemos saber más sobre esta función a través de la ayuda de R:

?cartogram_cont

Al igual que hacíamos en el punto anterior, podemos generar un mapa coroplético a través del cartograma obtenido y guardarlo en nuestro equipo.

# Generación del segundo mapa de cloropetas. Día 10/03/2020
gg10 <- ggplot(data = dia10) +
  geom_sf(aes(fill=dia10$D10), color='gray', size=0.3) +
  guides(fill=guide_colorbar(title = "10/03/2020")) +
  scale_fill_gradient(limits= c(0,3600), high = "#e34a33", low = "#fee8c8", guide = "colorbar") +
  xlab("Longitud") + ylab("Latitud") +
  ggtitle("COV-19 en España",
          subtitle = "Datos:10/03/2020") + 
  theme(plot.title = element_text(family="Comic Sans MS", face="bold"),
        legend.position = "left")

# Guardamos el mapa generado
ggsave(gg10, filename = "mapas/cov19_10_03_2020.png", width = 8,height=8,dpi = 150)

mapas animados con R cartograma

Si hacemos esto para el reto de días, tendremos en el directorio que hayamos escogido un total de 7 mapas en formato .PNG mediante los que podremos generar la animación final.

5. Animación final

Existen varias librerías de R que permiten generar animaciones, como gganimate o magick. magick es un paquete para crear mapas animados con R que envuelve a la potente librería ImageMagick STL para el procesamiento avanzado de imágenes. Entre sus funciones, permite la generación de fichero .GIF a través de una serie de imágenes de entrada.

# Generación de GIF
list.files(path = "./mapas", pattern = "*.png", full.names = T) %>% 
  map(image_read) %>% # lee las imagenes del directorio
  image_join() %>% # une las imagenes
  image_animate(fps=2) %>% # genera la animacion
  image_write("cov19.gif") # la guarda en un fichero .gif

mapas animados con R cov19_animate

Y, ¡esto es todo! Ya tendríamos en nuestro directorio de trabajo el fichero .GIF generado.

Si quieres aprender a trabajar con R y GIS puedes inscribirte a nuestro curso online de R y GIS. ¡Las plazas son limitadas!

Let’s connect!

Date de alta en nuestra newsletter y te enviaremos GRATIS el ebook que te ayudará a impulsar tu perfil GIS:
Vitaminas MappingGIS

Tan solo una vez al mes recibirás las últimas novedades del sector GIS y de nuestros cursos

3 comentarios en «Mapas de coropletas, cartogramas y mapas animados con R»

  1. Hola Diana, muchas gracias por compartir este método.

    Aunque están guardadas todas las imágenes en el directorio, en el último paso tengo el siguiente error: Warning message:
    In image_write(., «COVID.gif») : Writing image with 0 frames

    ¿Me podrías indicar cómo resolverlo?

    Desde ya muchas gracias

  2. Hola, cuando intento unirlos > datos_cov19<-merge(prov,contagios,by.x='COD_PROV',by.y='COD_PROV')
    Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column

    me sale el error, sabes por qué puede pasar?

    • Hola María,
      Este error te da porque las columnas que estás empleando para realizar la unión de cada objeto (prov y contagios) no parece que sean las mismas o tengan los mismos tipos de datos. Comprueba que es así, teniendo especial cuidado sobretodo en el tipo de datos (p.e, que no estés uniendo datos de tipo string con integer).
      Un saludo.

Los comentarios están cerrados.