Orlando Sabogal

Now researching in cycling and social capital

Hagamos un mapa: librería tmap

Orlando Sabogal / 2019-07-23


Como probablemente a muchas otras personas les ha pasado, la primera vez que vi La Marcha de Napoleón de 1812-1813 elabarado por Charles Joseph Minard en 1869 quedé impresionado. El mapa (ver siguiente Figura) narra la historia de la fallida campaña Napoleónica a Rusia y su regreso a Francia. La invasión comenzó el 12 de Marzo y durante mucho tiempo el ejército Francés avanzó sin que las fuerzas Rusas pudieran brindar mucha resistencia. Entre el 2 y 6 de Septiembre los generales Rusos ordenaron evacuar Moscú y quemar la ciudad, por lo que Napoleón encontró una ciudad sin las condiciones para albergar a sus soldados en invierno. Esto, sumado a que Rusia estaba reorganizando su ejército llevó a que el 19 de Octubre los franceses iniciaran la retirada. Pero la retirada tampoco sería fácil, el invierno y los Rusos los persiguieron sin piedad.

Lo que hace tan interesante el mapa de Minard es que logra encapsular mucha información en una sola imagen: cantidad de soldados, dirección, ubicación (longitud y latitud), división de las tropas, reagrupramiento de las tropas y temperatura. Edward Tufte en su libro The Visual Display of Quantitative Information lo resalta como el mejor gráfico estadístico jamás realizado.

Campaña Napoleónica contra Rusia en 1812. Tomado de Wikipedia

La obra de Minard comprende otros mapas bastante interesantes y que demuestran su capacidad creativa. Un gran mérito de Minard es haber fabricado sus mapas en una época sin computadores y sin herramientas para capturar y procesar información geográfica. Actualmente existen varias opciones para hacer mapas y tal vez la más popular sea utilizar un software de Sistemas de Información Geográfico (SIG) como QGIS. Este camino es bastante eficiente y permite realizar productos de gran calidad. Sin embargo, hay algo que personalmente encuentro molesto cuando utilizo SIGs y es que no está articulado de manera natural con todo mi flujo de trabajo. Dado que todo el procesamiento y análisis de datos lo hago en R, hacer un mapa en un SIG implica exportar los datos desde R y volverlos a cargar a QGIS. Adicional a esto, y dependiendo del software y tipo de mapa, puede llegar a ser muy complicado hacer mapas que sean reproducibles y que se puedan reciclar para hacer mapas similares.

Por supuesto, existen también varias opciones para hacer los mapas directamente en R como ggplot o la función plot(). El año pasado empecé a utilizar la librería tmap() desarrollada por Martijn Tennekes y en mi opinión es bastante fácil de usar, ofrece mucha flexibilidad y las funciones que trae permiten configurar muchos detalles de los mapas. En este blog voy a hacer una presentación de la librería y voy a enseñar las principales funcionalidades que he utilizado durante el último año. Espero que sea de gran ayuda y que con algo de esfuerzo sea más fácil producir mapas que, como el de la Marcha de Napoleón de Minard, narren historias y presenten información compleja en una imagen.

Hay muchos otros recursos (mirar la última sección) que enseñan a usar tmap. Mis dos principales motivaciones para hacer otro tutorial son que, por un lado, no existen muchos documentos en español que personas en latinoamérica que no leen en inglés pueden consumir. Y por el otro lado, quería hacer un documento para mi mismo con las principales operaciones que realizo en tmap y tener un guía personalizada para consultar en el futuro.


Introducción y Rudimentos

La lógica de tmap es similar a la de ggplot por lo que algo de experiencia en ggplot hará que sea mucho más fácil entender. Sin embargo, no es necesario tener conocimientos previos. De manera muy general, primero se define el objeto espacial que se va dibujar mediante la función tm_shape() y después se indica que se quiere graficar con ese objeto espacial y se pasa otra función dependiendo de su clase. Por ejemplo, si es un objeo de líneas la función a utilizar es tm_lines() o si es un objeto de polígonos se usa la función tm_polygons(). A continuacón se pueden agregar nuevos objetos espaciales usando de nuevo tm_shape() y usando una función para dibujarlo. Al agregar un nuevo objeto espacial este se dibuja sobre lo que ya se ha graficado, un funcionamiento análogo al de los SIGs.

Otra aspecto a tener en cuenta es que las funciones se van agregando mediante el operador “+”. Todas las funciones en tmap comienzan de la forma tm_.

Además de tmap, vamos a utilizar otras dos librerías:

library(tmap)
library(sf)

Primero creemos los objetos AlquilerBicicletas y Londres los cuales contienen puntos donde se puden rentar bicicletas en Londres y la división geográfica de Londres respectivamente.

AlquilerBicicletas <- spData::cycle_hire
Londres <- spData::lnd

Las estaciones y la ciudad se pueden dibujar de la siguiente manera:

tm_shape(shp = AlquilerBicicletas) + tm_dots()

tm_shape(Londres) + tm_polygons()

El primer mapa parece una nube de puntos y el segundo se limita a una división administrativa de la ciudad. Sobreponiendo las estaciones en los polígonos y configurando algunos argumentos se obtiene un mapa más interesante.

tm_shape(Londres) + tm_polygons(col = "ONS_INNER") +
  tm_shape(shp = AlquilerBicicletas) + tm_dots(size = "nbikes", alpha = 0.2, col = "blue")

En este nuevo mapa hicimos tres operaciones adicionales:

Esta representación permite ver que las estaciones están en el centro de Londres y sugiere que hay unos puntos de concentración de préstamos (hotspots). Casi en el centro del mapa hay una zona en la que al parecer no hay estaciones ¿alguna idea de por qué?

Un objeto de líneas se grafica siguiendo la misma lógica

Sena <- spData::seine #Rio Sena (y otros) en Francia
tm_shape(Sena) + tm_lines()

Modo Interactivo

Para hacer mapas interactivos hay que cambiar el modo plot al modo view en la función tmap_mode().

tmap_mode("view")

tm_shape(Londres) + tm_polygons(col = "ONS_INNER", alpha = 0.5) +
  tm_shape(shp = AlquilerBicicletas) + tm_dots(size = "nbikes", alpha = 0.2, col = "blue")