Análisis Espacial con R

Visualización de mapas con {tmap}

Dr. Francisco Zambrano Bigiarini

Hemera, Universidad Mayor

Paquetes y datos necesarios

# install.packages("spDataLarge", repos = "https://geocompr.r-universe.dev")
library(spData)
library(spDataLarge)
library(terra)
library(sf)

nz <- spData::nz
nz_height <- spData::nz_height
world <- spData::world
world <- st_read(system.file("shapes/world.gpkg", package="spData"))
Reading layer `world' from data source 
  `/home/francisco/R/x86_64-pc-linux-gnu-library/4.2/spData/shapes/world.gpkg' 
  using driver `GPKG'
Simple feature collection with 177 features and 10 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -180 ymin: -89.9 xmax: 180 ymax: 83.64513
Geodetic CRS:  WGS 84
elev = rast(system.file("raster/elev.tif", package = "spData"))
grain = rast(system.file("raster/grain.tif", package = "spData"))
nz_elev <- rast(system.file("raster/nz_elev.tif", package = "spDataLarge"))
urban_agglomerations <- spData::urban_agglomerations

¿Qué es {tmap}?

  • Un paquete para tematic maps, que permite crear mapas atractivos con mínimo codigo.

  • {tmap} al igual que {ggplot2} se basa en el principio de grammar of graphics. Separación entre los datos de entrada y el diseño.

  • Tiene la ventaja de crear mapas estáticos y interactivos con el mismo código.

  • Permite utilizar una amplia gamma de datos espaciales (ej, {raster} y {sf})

¿Qué es {tmap}?

  • El flujo básico de creación es primero utilizar la función tm_shape para indicar la data de entrada y luego un elemento de la capa que da el diseño.
library(tmap)
library(sf)
library(spData)

tm_shape(nz) +
  tm_fill()

Mapa de los bordes

tm_shape(nz) +
  tm_borders()

Mapa de los bordes y color de fondo gris.

tm_shape(nz) +
  tm_fill() +
  tm_borders()

Arreglos de mapas {tmap}

map_nz <- tm_shape(nz) +
  tm_polygons()

class(map_nz)
[1] "tmap"

Arreglos de mapas {tmap}

Podemos mezclar varios objetos y de diferente tipo.

library(spDataLarge)
map_nz1 <- map_nz +
  tm_shape(nz_elev) +
  tm_raster(alpha = 0.7)

Arreglos de mapas {tmap}

Podemos mezclar varios objetos y de diferente tipo.

nz_water <- st_union(nz)
nz_water <- st_buffer(nz_water,22200)
nz_water <- st_cast(nz_water,to = "LINESTRING")

map_nz2 = map_nz1 +
  tm_shape(nz_water) +
  tm_lines()

map_nz3 = map_nz2 +
  tm_shape(nz_height) + tm_dots()

Arreglos de mapas {tmap}

Podemos mezclar varios objetos y de diferente tipo.

tmap_arrange(map_nz1, map_nz2, map_nz3)

Aesthetics

  • Grammar of graphics se enfoca en la estética (Aesthetics).

  • Hasta ahora hemos visto las estéticas por defecto de {tmap}.

  • Nosostros podemos varias la estética de los mapas en {tmap}

  • Hay dos principales tipos de aesthetics:

    • Los que cambian con los datos.
    • Los que son constantes.
  • {tmap} acepta como argumento de estética una variable (basada en una columna) o un valor constante.

  • Las estéticas más comunmente usadas son para color de relleno y de borde, son color, transparencia, ancho de linea, que se setean con col, alpha, lwd y lty.

Aesthetics

ma1 = tm_shape(nz) + tm_fill(col = "red")
ma2 = tm_shape(nz) + tm_fill(col = "red", alpha = 0.3)
ma3 = tm_shape(nz) + tm_borders(col = "blue")
ma4 = tm_shape(nz) + tm_borders(lwd = 3)
ma5 = tm_shape(nz) + tm_borders(lty = 2)
ma6 = tm_shape(nz) + tm_fill(col = "red", alpha = 0.3) +
  tm_borders(col = "blue", lwd = 3, lty = 2)
tmap_arrange(ma1, ma2, ma3, ma4, ma5, ma6)

Aesthetics

tm_shape(nz) + 
  tm_fill(col = "Land_area")

Aesthetics

Podemos cambiar el título de la leyenda

legend_title = expression("Area (km"^2*")")
tm_shape(nz) +
  tm_fill(col = "Land_area", title = legend_title) + 
  tm_borders()

Configuración del color

  • Como defino la leyenda de colores no es algo trivial. Muchos problemas de interpretación de resultados se generan por una mala visualización.

  • La configuración predeterminada de {tmap} usa pretty breaks.

Los argumentos: - breaks permite manualmente ajustar los breaks - n define el numérp de bin en el cual la variable es categorizada - palette define el esquema de colores

Configuración del color

mcol1 <- tm_shape(nz) + tm_polygons(col = "Median_income")
breaks = c(0, 3, 4, 5) * 10000
mcol2 <- tm_shape(nz) + tm_polygons(col = "Median_income", breaks = breaks)
mcol3 <- tm_shape(nz) + tm_polygons(col = "Median_income", n = 10)
mcol4 <- tm_shape(nz) + tm_polygons(col = "Median_income", palette = "BuGn")
tmap_arrange(mcol1,mcol2,mcol3,mcol4,nrow = 1)

6. Configuración del color

  • Podemos modificar la escala de colores con el argumento breaks

  • Además de poder cambiar los breaks de forma manual {tmap} permite usar algorítmos para definir la escala.

Los seis más utilizados algorítmos son:
- style = "pretty", la configuración predeterminada, redondea los breaks en números enteros cuando sea posible y los espacia uniformemente;
- style = "equal" divide los valores de entrada en contenedores de igual rango y es apropiado para variables con una distribución uniforme;
- style = "quantile" asegura que el mismo número de observaciones caiga en cada categoría;
- style = "jenks" identifica grupos de valores similares en los datos y maximiza las diferencias entre categorías;
- style = "cont" (y “order”) presentan una gran cantidad de colores sobre campos de color continuos y son particularmente adecuados para rásteres continuos (“order” puede ayudar a visualizar distribuciones sesgadas);
- style = "cat" fue diseñado para representar valores categóricos y asegura que cada categoría reciba un color único.

Configuración del color

mcol5 <- tm_shape(nz) + 
  tm_polygons(col = "Median_income", style="pretty")
mcol6 <- tm_shape(nz) + 
  tm_polygons(col = "Median_income", style="equal")
mcol7 <- tm_shape(nz) + 
  tm_polygons(col = "Median_income", style="quantile")
mcol8 <- tm_shape(nz) + 
  tm_polygons(col = "Median_income", style="jenks")
mcol9 <- tm_shape(nz_elev) + 
  tm_raster(style="cont")
mcol10 <- tm_shape(nz) + 
  tm_polygons(col = "Island", style="cat")

Configuración del color

tmap_arrange(mcol5,mcol6,mcol7,mcol8,mcol9,mcol10,ncol=3)

Configuración del color

¿Qué paleta de color usar?

  • se puede modificar cambiar el argumento palette

  • Una ayuda para seleccionar paleta tmaptools::palette_explorer()

  • con el signo - antes del nombre de la paleta la invierte.

  • Hey tres grupos de paletas:

    • categorical: variables categóricas ej., landcover
    • sequencial: variable continuas, sigue un gradiente, por ejemplo de claro a oscuro
    • diverging: variable continua, une dos paletas sequencial

Map layout (Diseño)

  • El diseño del mapa se refiere a la combinación de todos los elementos del mapa en un mapa armónico

  • Flecha norte y escala

map_nz + 
  tm_compass(type = "8star", position = c("left", "top")) +
  tm_scale_bar(breaks = c(0, 100, 200), text.size = 1)

Map layout (Diseño)

El argumento tm_layout permite ajustar varios aspectos de diseño (?tm_layout).

mnz1 <- map_nz + tm_layout(title = "New Zealand")
mnz2 <- map_nz + tm_layout(scale = 5)
mnz3 <-map_nz + tm_layout(bg.color = "lightblue")
mnz4 <-map_nz + tm_layout(frame = FALSE)
tmap_arrange(mnz1,mnz2,mnz3,mnz4)

7. Map layout (Diseño)

  • Tambien {tmap} tiene algunos estilos predefinidos que modifican el diseño completo del mapa con la función tm_style.
tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders(col='red') +
  tm_style('classic')

7. Map layout (Diseño)

  • Tambien {tmap} tiene algunos estilos predefinidos que modifican el diseño completo del mapa con la función tm_style.
tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders(col='red') +
  tm_style('cobalt')

Map layout (Diseño)

  • Tambien {tmap} tiene algunos estilos predefinidos que modifican el diseño completo del mapa con la función tm_style.
tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders(col='red') +
  tm_style('col_blind')

Mapas en paneles (faceted)

  • Los mapas en paneles (facetados), también denominados “múltiplos pequeños”, se componen de muchos mapas dispuestos uno al lado del otro y, a veces, apilados verticalmente.

  • Los paneles (facets) permiten visualizar cómo cambian las relaciones espaciales con respecto a otra variable, como el tiempo.

  • Data urban agglomerations corresponde a las 50 mayores áreas urbanas en el mundo.

Mapas en paneles (faceted)

Como varia la población entre 1970, 1990, 2010, 2020

ix <- urban_agglomerations$year %in% c(1970,1990,2010,2030)
urb_1970_2030 <- urban_agglomerations[ix,]

tm_shape(world) +
  tm_polygons() +
  tm_shape(urb_1970_2030) +
  tm_symbols(col = "black", border.col = "white", size = "population_millions") +
  tm_facets(by = "year", nrow = 2, free.coords = FALSE)

Mapas en paneles (faceted)

¿Qué hizo tm_facets?

  • Las geometrías que no tenian la variable facet year se repitieron en todos los paneles (ej, world)
  • El argumento by hace varias de acuerdo a la variable year
  • El argumento nrow/ncol especifica el número de filas/columnas
  • El argumento free.coords especifica si cada panel tiene sus propios límites.

Mapas interactivos

  • El lanzamiento del paquete {leaflet} en 2015 revolucionó la creación de mapas interactivos en R.

  • De {leaflet} derivaron otros paquetes {leaflet.extras}, {mapview} y {tmap}

  • Una característica especial de {tmap} es que permite crear mapas estáticos e interactivos usando el mismo código.

  • Los mapas pueden verse de forma interactiva en cualquier momento configurando {tmap} en modo view

    • tmap_mode("view").

Mapas interactivos

tmap_mode("view")
tm_shape(nz) + 
  tm_polygons()

Mapas interactivos

Podemos especificar el mapa base con tm_basemap

tmap_mode("view")
tm_shape(nz) + 
  tm_polygons() + 
  tm_basemap(server = "OpenTopoMap")

Mapas interactivos

También funciona con facets

world_coffee <-  merge(world, coffee_data, by = "name_long")
facets = c("coffee_production_2016", "coffee_production_2017")
tm_shape(world_coffee) + 
  tm_polygons(facets) + 
  tm_facets(nrow = 1, sync = TRUE)

12. Mapas interactivos

para volver a modo tmap estático tmap_mode("plot")