R es el lenguaje por excelencia para el análisis estadístico y actualmente constituye una de las herramientas más populares para la generación de gráficos de gran calidad y complejidad.
En multitud de campos la mejor forma de mostrar los resultados suele ser la construcción de un mapa, de tal forma que podamos hacer accesible esta información a cualquiera con un solo vistazo.
Muchos paquetes y funciones para la generación de gráficos se apoyan en los motores gráficos base de R. Sin embargo, para ciertos gráficos avanzados se quedan cortos. En este post, siguiendo con la estrecha relación entre R y los SIG, mostraremos los pasos para construir mapas con R con un acabado profesional utilizando el paquete ggplot2.
Índice
¿Cómo se organizan los gráficos en R?
Antes de adentrarnos en el paquete ggplo2, es interesante conocer el funcionamiento del sistema de gráficos en R. Este sistema está formado por:
- Paquetes gráficos.
- Sistemas gráficos.
- Motor de dispositivos gráficos.
- Paquetes de dispositivos gráficos.
El núcleo funcional lo componen el motor de gráficos (grDevices) y los sistemas gráficos (graphics para gráficos tradicionales y grid para gráficos de malla o rejilla).
En otros lenguajes de programación la capacidad de construir gráficos la proporciona librerías adicionales ajenas al núcleo (como matplotlib para Python). En R contamos con graphics y grDevices ya integrados. En 2001, Paul Murrell desarrolló grid, otro sistema gráfico para facilitar la creación de gráficos de rejillas. El paquete grDevices permite modificar las fuentes, colores.. y da soporte a los dispositivos gráficos que permiten la exportación a varios formatos.
El sistema de gráficos tradicionales está formado por funciones del paquete graphics, mientras que el sistema de gráficos de rejilla lo componen funciones del paquete grid. Además, existen muchas librerías adicionales como ggplot2 o lattice que proporcionan acceso a funciones gráficas, pero todas se crean a partir de graphics o grid.
Primeros pasos para crear mapas con R
El paquete ggplot2 permite elaborar gráficos a partir de un proceso de acumulación de capas. Tiene cierto grado de complejidad, pero permite obtener resultados muy profesionales.
En este post vamos a generar mapas con R utilizando datos descargados de la Infraestructura de Datos Espaciales del Gobierno de La Rioja.
Instalación y carga de librerías
El primer paso, es instalar (si no se ha hecho ya) y cargar las librerías necesarias para trabajar:
install.packages("ggplot2") install.packages("sf") library(sf) library(ggplot2)
ggplo2 no maneja datos espaciales específicamente. Por lo que utilizaremos las clases que proporcional el paquete sf para el tratamiento de los datos espaciales.
→ El soporte para clases sf está disponible desde la versión 3.0.0 de ggplot2.
Cargar datos espaciales en R
Antes de crear un gráfico con ggplot2, es necesario tener en nuestra sesión de R los datos que vayamos a utilizar para generar el mapa. Vamos a comenzar leyendo con la función st_read() del paquete sf dos archivos: uno con los municipios y otro con las carreteras de la provincia de La Rioja.
# Lectura de archivos de datos vectoriales municipios <- st_read("municipios.json") carreteras <- st_read("carreteras.json")
Es importante tener en cuenta que para que estos ficheros se lean correctamente deben estar situados en nuestro directorio de trabajo.
Creación de un mapa base básico con ggplot
Cada gráfica que generemos con ggplot2 tiene tres componentes clave:
- Los datos que se van a graficar.
- Características estéticas.
- Al menos una capa que describe como representar los datos.
Para crear un gráfico que represente un mapa base de La Rioja es necesaria la combinación de los componentes nombrados. Si el fichero de datos cargado en el apartado anterior se ha leído correctamente y se ha convertido en un objeto sf, podremos hacerlo de la siguiente manera:
# Mapa base sencillo de La Rioja ggplot(data = municipios) + geom_sf()
Esta llamada introduce muy bien la estructura de creación de un gráfico con el paquete ggplot2:
- La primera parte ggplot(data = municipios) indica que los datos principales se almacenan en el objeto municipios.
- La línea termina con un signo positivo +, que indica que la llamada aún no está completa, y cada línea que va a continuación corresponde a otra capa. El funcionamiento de ggplot2 consiste en concatenar llamadas a funciones hasta crear el mapa que deseemos.
- Por último, usamos la función geom_sf, que sirve para agregar la geometría almacenada en un objeto sf
Proyecciones
Por defecto, el mapa toma el sistema de coordenadas de la primera capa que definimos. Si no hay ningún sistema de referencia de coordenadas definido, utiliza WGS84 (latitud/longitud, el sistema de referencia usado en el GPS).
La función coord_sf nos permite escoger otro sistema de coordenadas. Usando el argumento crs, es posible anular esta configuración y reproyectar los datos a cualquier proyección utilizando cualquier cadena PROJ4 válida:
# Modificacion de la proyeccion ggplot(data = municipios) + geom_sf() + coord_sf(crs = "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ")
Colores y bordes
Sin duda alguna, los colores de los objetos representados en un mapa tienen una importancia máxima. Podemos personalizar el color del relleno de todos los objetos y los bordes que incluyamos en nuestro mapa.
En este ejemplo, se genera un mapa dónde todos los elementos tienen el mismo color:
ggplot(data = municipios) + geom_sf(fill = "greenyellow", color = "black")
ggplot2 también permite el uso de paletas de color más complejas, como por ejemplo, generar un degradado en función de una variable de los datos.
ggplot(data = mun) + geom_sf(aes(fill = area))
Título, subtítulo, y etiquetas de los ejes
Para añadir más información al mapa, podemos agregarle un título, un subtítulo y las etiquetas de los ejes.
# Añado titulo, ejes y etiquetas de los ejes ggplot(data = municipios) + geom_sf(aes(fill=area)) + xlab("Longitud") + ylab("Latitud") + ggtitle("Mapa de los municipios de La Rioja", subtitle = "Realizado por: Diana Alonso")
Para introducir un título y un subtítulo se emplea la función ggtitle. Mientras que las etiquetas de los ejes x e y puede añadirse con la funciones xlab e ylab respectivamente.
Añadir más capas al mapa
Lo más normal es que tengamos que crear mapas con más capas de información. El procedimiento es el mismo que para añadir una capa, se emplea la función geom_sf cuando se quiere añadir objetos sf.
Los municipios nos sirven como fondo en la visualización de datos geoespaciales, pero podemos añadir más capas con mayor información, como por ejemplo las carreteras que hemos cargado al principio del post.
ggplot(data = municipios) + geom_sf(color='black') + xlab("Longitud") + ylab("Latitud") + ggtitle("Mapa de los municipios de La Rioja", subtitle = "Realizado por: Diana Alonso") + geom_sf(data=carreteras, color = 'red')
Flecha de norte y escala
El paquete ggplot2 no incluye funciones que permitan incorporar barras de escalas o flechas de norte. Para ello, debemos acceder a paquetes adicionales como ggspatial (https://github.com/paleolimbot/ggspatial).
Utilizando este paquete, las flechas del norte se agregan usando la función annotation_north_arrow(), y las barras de escala se pueden agregar usando annotation_scale().
# Instalación y carga de ggspatial install.packages('ggspatial') library(ggspatial) # Creación de mapa con flecha de norte y barra de escala ggplot(data = municipios) + geom_sf(color='black') + xlab("Longitud") + ylab("Latitud") + ggtitle("Mapa de los municipios de La Rioja", subtitle = "Realizado por: Diana Alonso") + geom_sf(data=carreteras, color = 'red') + annotation_scale() + annotation_north_arrow(location='tr')
Estas funciones “reconocen el espacio”, es decir, saben dónde está el norte y cuál es la distancia a través de la trama. Por lo tanto, solo tienen argumentos que permiten establecer su situación y aspecto dentro del mapa. Por ejemplo, el argumento location permite modificar la localización de la flecha o la barra dentro del gráfico. Sus posibles valores son:
- tr (top right) que generará el objeto arriba a la derecha.
- tl (top left) que generará el objeto arriba a la izquierda.
- br (bottom right) que generará el objeto abajo a la derecha.
- ….
Además, el argumento style permite escoger entre los estilos para las barras de escala y los estilos para las flechas del norte disponibles. Para consultar más información sobre su personalización, se puede recurrir a la ayuda de R:
?annotation_scale ?annotation_north_arrow
Ventajas de crear mapas con R frente a hacerlo con software GIS
Las soluciones más comunes para generar mapas involucran software GIS como QGIS o ArcMap. Y entonces, ¿qué ventajas nos ofrece R frente al software GIS para generar nuestros mapas? Algunas de ellas son:
- R es un software libre, lo que lo hace accesible para todos.
- Los elementos de un mapa se pueden agregar o eliminar con facilidad.
- Podemos reutilizar código rápidamente para generar el mismo tipo de mapa pero con otros datos.
- Podemos automatizar rápidamente la creación de multitud de mapas.
- Tiene un lenguaje interactivo, estructuras de datos, disponibilidad de gráficos, una comunidad desarrollada y la ventaja de agregar más funcionalidades a través de un ecosistema enorme de paquetes.
Si quieres aprender a trabajar con R y utilizar sus capacidades estadísticas en el mundo geoespacial, inscríbete ya en nuestro curso online de R y SIG.
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, antes de nada quería darle las gracias por este post. Te quería preguntar si es posible representar con puntos distintas localizaciones georreferenciadas. Yo tengo el mapa tal y como indicas en este post y me gustaria añadir puntos (de los cuales tengo las coordenadas) para señalarlos en el mapa.
Un saludo, muchas gracias!
Cordial saludo Diana. Puedo partir de datos en formato Shape para la elaboración de capas iniciales
Hola Carlos,
No hay ningún problema. La lectura de un fichero Shapefile de Esri con
el paquete sf se realiza de la siguiente forma:
municipios <- st_read("C:/datos/municipios.shp")
Puedes consultar más información en la documentación oficial.
Un saludo.
¿Donde puedo encontrar datos espaciales de Cuba en formato json?
Hola Frank,
Lamentablemente no estoy familiarizada con las Infraestructuras de Datos Abiertos de allí, ni conozco portales de descarga de datos abiertos de Cuba.
Algunas web dónde puedes encontrar datos abiertos de todo el mundo son:
– https://data.world/datasets/gis
– https://hub.arcgis.com/search
– https://gadm.org/
– http://www.diva-gis.org/gData
Espero que te sirva.
Un saludo.
Muchas Gracias Diana
Encontré esta web con datos de mi país.
https://geo.nyu.edu/catalog/stanford-xp571my4733
Mucas gracias
buen dia, quiero probar ggplot2 a modo didactico, donde puedo consguir los archivos .json que se menciona en la publicacion?
Muchas gracias
¡Hola marceloi!
Los datos pertenecen a la Infraestructura de Datos Abiertos del Gobierno de la Rioja. Los puedes descargar a través del catálogo de datos de su página web o más rápidamente desde su repositorio de Github en https://github.com/iderioja/base_datos_geografica.
Un saludo.
Muy interesante esta entrada. Quería preguntarte, cuando añades el código geom_sf(aes(fill = area)), el propio paquete elige y añade automáticamente la rampa de color, ¿no?
¡Hola Jesús!
Muchas gracias por tu comentario.
Cuando no añades nada más, R automáticamente utiliza la rampa de color que se muestra en el ejemplo por defecto. Pero puedes modificar varios aspectos del código para escoger el resultado que tú quieras con los colores que desees. El paquete ggplot2 contiene una serie de funciones que te permiten establecer una escala de gradientes en función del tipo de objeto que vayas a representar en el mapa. Tienes funciones que te permiten escoger dos o más colores para crear un gradiente de escala.
Por ejemplo usando scale_fill_continuous:
ggplot(data = municipios) +
geom_sf(aes(fill = area), color='black') +
scale_fill_continuous(low = "#fff7ec", high = "#7F0000")
Otras que permiten utilizar gradientes de colores ya estalecidos (scale_fill_gradient)
ggplot(data = municipios) +
geom_sf(aes(fill = area), color='black') +
scale_fill_gradientn(colours = terrain.colors(10))
Y además, también tienes otras funciones que te permiten usar paquetes muy conocidos de R para la generalización de paletas de colores como RBrewerColor o Viridis.
Puedes consultar más información en el siguiente enlace: https://ggplot2.tidyverse.org/reference/scale_gradient.html
Un saludo.