Cómo crear mapas de calor o heatmaps en R

Los mapas de calor o heatmaps son poderosas herramientas que nos permiten identificar rápidamente la densidad de datos de un fenómeno que queremos analizar. De un solo vistazo y gracias a una gama de colores, podemos clasificar los datos y conocer en qué lugares la concentración de estos es mayor. 

¡Importante! No debemos confundir los heatmaps con los mapas de coropletas. Los mapas de coropletas representan datos geográficos utilizando colores o patrones en áreas geográficas, como países o regiones. Mientras que los mapas de calor muestran la densidad o intensidad de un fenómeno en una superficie de dos dimensiones. Esto quiere decir que pueden usarse para analizar datos en contexto no geoespaciales, ya que no tienen porque estar vinculados a áreas geográficas.

En otros artículos ya vimos cómo crear heatmaps en QGIS, cómo crearlos en GeoServer e incluso cómo hacerlo en OpenLayers. En esta ocasión, vamos a dar todas las claves para poder introducirlos en nuestros análisis estadísticos y espaciales en R y RStudio.

Carga de las librerías de R

Para crear heatmaps en R vamos a necesitar las siguientes librerías de R:

  • sf para la lectura y manipulación de datos vectoriales.
  • ggplot2 y ggmap para la generación de gráficos donde ver nuestros resultados.

Recomendamos instalarlos (si no los tenemos ya) y cargarlos al inicio de nuestra sesión  R:

# ¡Ojo! No es necesario reinstalar aquellas librerías que ya tenemos
install.packages("sf")
install.packages("ggplot2")
install.packages("ggmap")

library(sf)
library(ggplot2)
library(ggmap)

Anetriormente, ya habíamos trabajado con las conocidas librerías sfggplot2 (por ejemplo en Creación de mapas con R y ggplo2). En este artículo, hablamos por primera vez del paquete ggmap. Esta librería complementa a ggplo2 permitiéndonos la recuperación de mosaicos de mapas ráster de servicios populares de mapas en línea. Concretamente de Stadia Maps, Google MapsOpenStreetMap.

Tanto para trabajar con Stadia Maps como con Google Maps, se necesita un API KEY. En este tutorial vamos a utilizar los mapas que sirve Stadia Maps, ya que permite obtener un API KEY gratuita para uso no comercial registrándonos en su web. Podéis encontrar más información en el repositorio o en la propia página de cada proveedor.

Una vez realizado el registro y obtenida el API KEY, se registra en R mediante la función register_stadiamaps():

# Sutituímos TU_API_KEY por la clave obtenida tras el registro
register_stadiamaps(key="TU_API_KEY")

En el caso de querer usar mapas de Google Maps, debemos emplear la función register_google():

# Sutituímos TU_API_KEY por la clave obtenida tras el registro
register_google(key="TU_API_KEY")

Una vez registrada una clave, ya podemos empezar a trabajar con los datos.

Importamos los datos

Para aprender a generar un mapa de calor en R, vamos a trabajar con dos conjuntos de datos obtenidos de datos.gob.es.

Datos.gob es plataforma oficial que reúne los datos abiertos de todos los organismos públicos españoles federados.

Vamos a descargar y utilizar los siguientes conjuntos de datos:

Con estos datos, vamos a generar un mapa de calor que nos muestre en la zona de Navarra (España) las principales zonas afectadas por el robo de vehículos. Como ya hemos visto en otras ocasiones, vamos a cargar nuestros datos como objetos de la clase sf del paquete sf.

# Lectura de archivos de datos vectoriales con sf
robos <- st_read("SOCIAL_Sym_Robos.shp")
zona_estudio <- st_read("CATAST_Pol_Municipio.shp")

Echamos un vistazo rápido a los datos cargados empleando la librería ggplot2:

ggplot(data = limites) +
  geom_sf(color='black') +
  xlab("Longitud") + ylab("Latitud") +
  ggtitle("Mapa robos de vehículos de Navarra",
        subtitle = "Realizado por: Diana Alonso") +
  geom_sf(data=robos, color = 'red')

Como os comentábamos arriba, podéis revisar el artículo Creación de Mapas con R y ggplot2, dónde se explica en profundidad cada una de estás funciones del paquete ggplot2.

Nuestros datos empleados están en el sistema de referencia ETRS89 / UTM zone 30N (EPSG:25830). Para trabajar conjuntamente con Google Maps o Stadia Maps, vamos a reproyectarlos al sistema WGS84 (EPSG:4326).

# Reproyectamos a EPSG:4326
robos <- st_transform(robos, 4326)
limites <- st_transform(limites, 4326)

Creamos un mapa de calor

A continuación, vamos a obtener un fondo para nuestro mapa de calor con la función get_stadiamap() de ggmapVamos a utilizar el estilo Alidade Smooth de Stadia Map. Se pueden consultar todos los estilos disponibles aquí.

# Extraemos los límites del área de estudio
bbox <- st_bbox(limites) %>%
as.vector()

# Obtenemos fondo
m_limites <- get_stadiamap(bbox= bbox, zoom = 8, maptype = "alidade_smooth")

Se puede dibujar el fondo obtenido con la función ggmap():

ggmap(m_limites)

Como veréis, podemos prescindir de esta parte para la obtención del mapa de calor y utilizar únicamente los límites que cargábamos al inicio.

stat_density2() de ggplot2 es la función que nos permite generar heatmaps en R. Para ello, necesitamos indicar la longitud y latitud de los puntos, por lo que previamente a la generación del mapa debemos extraer estos datos en dos columnas nuevas.

# Extraemos en dos dos columnas nueva la longitud y latitud
robos$lon <- st_coordinates(robos)[,1]
robos$lat <- st_coordinates(robos)[,2]

ggmap(m_limites) +
  stat_density2d(
    aes(x = lon, y = lat, fill = ..level..), 
    alpha = 0.2, 
    data = robos, 
    geom = "polygon", 
    bins = 30) +
  scale_fill_gradient(low = "yellow", high = "red", guide = guide_colorbar(title = "Robos")) +
  ggtitle("Robos de vehículos de Navarra",
          subtitle = "Realizado por: Diana Alonso")

Podemos modificar el número de niveles con el argumento bins, así como elegir la paleta de colores que nos resulte más apropiada con la función scale_fill_gradient(). Incluso, podemos añadir contornos a las densidades con la función geom_density2d():

ggmap(m_limites) +
  stat_density2d(
    aes(x = lon, y = lat, fill = ..level..), 
    alpha = 0.2, data = robos, geom = "polygon", bins = 30) +
  scale_fill_gradient(low = "yellow", high = "red", guide = guide_colorbar(title = "Robos")) +
  geom_density2d(data = robos, aes(x = lon, y = lat), size = 0.3, colour="red") +
  ggtitle("Robos de vehículos de Navarra",
          subtitle = "Realizado por: Diana Alonso")

Y, ¡esto es todo! Ya tenemos nuestro mapa de calor en R.

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

Deja un comentario