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.
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.
Índice
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:
- Centro Europeo para la Prevención y Control de Enfermedades
- Datos de pandemia de coronavirus 2019-20 / Casos médicos de Japón
- Datos de pandemia de coronavirus 2019-20 / Casos médicos de Italia
- Visor de datos Globales
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
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)
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)
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
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!

Tutora del curso de R y SIG. Grado en Ingeniería en tecnologías de la información y en Geomática y topografía. Máster en Ingeniería y geoinformación. Echa un vistazo a todos nuestros cursos de SIG online.
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
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.