Creación de mapas con {tmap}

Dr. Francisco Zambrano

Contenidos

  1. ¿Qué es {tmap}?
  2. Un primer mapa básico
  3. Arreglos de mapas
  4. Estéticas del mapa
  5. Configuración de color
  6. Diseño del mapa
  7. Mapas interactivos

1. ¿Qué es {tmap}?

1. ¿Qué es {tmap}?

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

  • 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}, {terra} y {sf})

1. ¿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() 

2. Un primer mapa

2. Un primer mapa

tm_shape(nz) +
  tm_borders() 

2. Un primer mapa

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

3. Arreglos de mapas {tmap}

3. Arreglos de mapas {tmap}

map_nz <- tm_shape(nz) + 
  tm_polygons()

class(map_nz)
[1] "tmap"

3. 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)

3. 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()

3. Arreglos de mapas {tmap}

Podemos mezclar varios objetos y de diferente tipo.

tmap_arrange(map_nz1, map_nz2, map_nz3)

4. Aesthetics

4. 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.

4. 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)

4. Aesthetics

¡Esto puede ser confuso!

  • Como en base R los argumentos pueden tener valor que varien (una variable).

  • Pero a diferencia de base R, {tmap} no acepta vectores numéricos como argumento.

Esto funciona

plot(st_geometry(nz), col = nz$Land_area)  # funciona

4. Aesthetics

Pero esto NO

tm_shape(nz) + tm_fill(col = nz$Land_area) # no funciona
  • En cambio, col (y otras estéticas que pueden variar, como lwd para líneas y size para capas de puntos) requiere una cadena de caracteres que nombre un atributo asociado con la geometría que se trazará.
head(nz)
Simple feature collection with 6 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 1568217 ymin: 5518431 xmax: 2089533 ymax: 6191874
Projected CRS: NZGD2000 / New Zealand Transverse Mercator 2000
           Name Island Land_area Population Median_income Sex_ratio
1     Northland  North 12500.561     175500         23400 0.9424532
2      Auckland  North  4941.573    1657200         29600 0.9442858
3       Waikato  North 23900.036     460100         27900 0.9520500
4 Bay of Plenty  North 12071.145     299900         26200 0.9280391
5      Gisborne  North  8385.827      48500         24400 0.9349734
6   Hawke's Bay  North 14137.524     164000         26100 0.9238375
                            geom
1 MULTIPOLYGON (((1745493 600...
2 MULTIPOLYGON (((1803822 590...
3 MULTIPOLYGON (((1860345 585...
4 MULTIPOLYGON (((2049387 583...
5 MULTIPOLYGON (((2024489 567...
6 MULTIPOLYGON (((2024489 567...

4. Aesthetics

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

4. 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()

5. Configuración del color

5. 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éro de bin en el cual la variable es categorizada
- palette define el esquema de colores

5. Configuración del color

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

5. 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.

5. 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(col = "elevation", style="cont")
mcol10 <- tm_shape(nz) + 
  tm_polygons(col = "Island", style="cat")

5. Configuración del color

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

5. 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

6. Map layout (Diseño)

6. 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)

6. 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)

6. Map layout (Diseño)

Algunos argumentos

  • Ancho del marco (frame.lwd) y la opción para permitir doble linea (frame.double.line)
  • Configuración de los margenes outer.margin y inner.margin
  • Configuración del tipo de letra fontface y fontfamily
  • Leyenda legend.show (mostra o no la leyenda) legend.only (omitir el mapa) y legend.outside (poner la leyenda fuera del mapa), legend.position para ubicar la leyenda en un posición dada
  • Color por defecto de la capas aesthetic (aes.color), atributos del mapa como el marco (attr.color)
  • Control del color sepia.intensity (que tan amarillo el mapa luce) y saturación (a color-grayscale)

6. Map layout (Diseño)

Ancho del marco frame.lwd

tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders() +
  tm_layout(frame.lwd=5)

6. Map layout (Diseño)

Margen interior inner.margins

tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders() +
  tm_layout(inner.margins = 0.2)

6. Map layout (Diseño)

No incluir la legenda legend.show

tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders() +
  tm_layout(legend.show = FALSE)

6. Map layout (Diseño)

Posición de la leyenda legend.position

tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders() +
  tm_layout(legend.position = c("right","bottom"))

6. Map layout (Diseño)

Efecto sepia sepia.intensity

tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders() +
  tm_layout(sepia.intensity = .5)

6. Map layout (Diseño)

Efecto saturación saturation

tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders() +
  tm_layout(saturation = .2)

6. Map layout (Diseño)

Color por defecto attr.color

tm_shape(nz) + 
  tm_fill(col = "Land_area") + 
  tm_borders(col='red') +
  tm_layout(attr.color = 'red')

6. 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('bw')

6. 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')

6. 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')

6. 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('bw')

7. Mapas interactivos

7. 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").

7. Mapas interactivos

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

7. Mapas interactivos

Podemos especificar el mapa base con tm_basemap

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

7. 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(ncol = 2, sync = TRUE)

7. Mapas interactivos

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