💡 Datos para la actividad:

Datos

Script

GEOVISUALIZACIÓN CON R: EL PAQUETE TMAP

Dentro del conjunto de paquetes de R que facilitan la elaboración de materiales cartográficos, tmap(Tennekes 2018a) es uno más utilizados, tanto para la simple visualización de geometrías espaciales o geometrías espaciales junto con sus atributos, como para la creación de mapas en los que se superponen diferentes capas temáticas. Como veremos más adelante, estos mapas pueden presentarse en dos modos: como mapa estático y como mapa interactivo, y también en forma de animaciones de mapas. Es un paquete fácil de usar y acepta diferentes formatos de datos de entrada; debe recordarse que en R la información espacial es manejada en diferentes tipos de objetos; por ejemplos los paquetes sf para datos en formato vectorial, y terra o stars para datos raster.

Para el desarrollo de la actividad serán necesarios 3 paquetes:

Para activar los paquetes tmap(), sf() y terra() primero hay que conocer si ya está instalado:

system.file(package='tmap')
## [1] "D:/Documentos/R/win-library/4.3/tmap"
system.file(package='sf')
## [1] "D:/Documentos/R/win-library/4.3/sf"
system.file(package='raster')
## [1] "D:/Documentos/R/win-library/4.3/raster"

Si ya estuvieran instalados se activan con la función library().

library(tmap)
library(sf)
library(terra)

También se deben importar los ficheros necesarios para realizar los ejercicios

Además, se importará el fichero raster nz_elev.tif.

tmap puede utilizarse elaborar un mapa sencillo, con la función qtm(), o utilizar un conjunto de funciones cuya sintaxis siempre comienza por tm_shape(), para mapas más elaborados.

LA FUNCIÓN qtm()

El paquete tmap ofrece la posibilidad de representar gráficamente una única variable (un único atributo) de manera rápida y sencilla, mediante la función qtm(), por lo que puede ser útil para explorar rápidamente cualquier información espacial. Esta función ofrece una sintaxis similar a la de un mapa normal, pero sólo admite un único objeto.

A continuación se cargarán cuatro objetos que se encuentran preinstalados en el propio paquete tmap.

data(World, rivers, metro, NLD_prov, NLD_muni)

Es conveniente utilizar la función str() para conocer cuál es la estructura interna de los objetos con los que trabajamos. Por ejemplo, la del objeto World es la siguiente:

str(World)
## Classes 'sf' and 'data.frame':   177 obs. of  16 variables:
##  $ iso_a3      : Factor w/ 177 levels "AFG","AGO","ALB",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ name        : Factor w/ 177 levels "Afghanistan",..: 1 4 2 166 6 7 5 56 8 9 ...
##  $ sovereignt  : Factor w/ 171 levels "Afghanistan",..: 1 4 2 159 6 7 5 52 8 9 ...
##  $ continent   : Factor w/ 8 levels "Africa","Antarctica",..: 3 1 4 3 8 3 2 7 6 4 ...
##  $ area        : Units: [km^2] num  652860 1246700 27400 71252 2736690 ...
##  $ pop_est     : num  28400000 12799293 3639453 4798491 40913584 ...
##  $ pop_est_dens: num  43.5 10.3 132.8 67.3 15 ...
##  $ economy     : Factor w/ 7 levels "1. Developed region: G7",..: 7 7 6 6 5 6 6 6 2 2 ...
##  $ income_grp  : Factor w/ 5 levels "1. High income: OECD",..: 5 3 4 2 3 4 2 2 1 1 ...
##  $ gdp_cap_est : num  784 8618 5993 38408 14027 ...
##  $ life_exp    : num  59.7 NA 77.3 NA 75.9 ...
##  $ well_being  : num  3.8 NA 5.5 NA 6.5 4.3 NA NA 7.2 7.4 ...
##  $ footprint   : num  0.79 NA 2.21 NA 3.14 2.23 NA NA 9.31 6.06 ...
##  $ inequality  : num  0.427 NA 0.165 NA 0.164 ...
##  $ HPI         : num  20.2 NA 36.8 NA 35.2 ...
##  $ geometry    :sfc_MULTIPOLYGON of length 177; first list element: List of 1
##   ..$ :List of 1
##   .. ..$ : num [1:69, 1:2] 61.2 62.2 63 63.2 64 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:15] "iso_a3" "name" "sovereignt" "continent" ...

Al mismo tiempo, podemos visualizar su contenido con la función View().

View(World)

Como ya se ha señalado, la función qtm() sólo require un objeto (en este caso, sólo se representa su geometría -mapa base-) para proporcionar una primera salida gráfica:

qtm(World)

Sin embargo, también permite personalizar otros elementos del mapa. Por ejemplo:

qtm(World) + 
  tm_layout(main.title = "Mapa del mundo")

qtm(World, 
    fill = "economy")

Este mapa de coropletas puede ser mejorado sustancialmente incorporando argumentos adicionales:

qtm(World, 
    fill="HPI", 
    fill.n = 9, 
    fill.palette = "div",
    fill.title = "Happy Planet Index", 
    fill.id = "name", 
    style = "gray", 
    format = "World", 
    projection = "+proj=eck4")

Incluso es posible superponer dos mapas, uno con los paises del mundo y otro con las ciudades más populosas. Obsérvese que, en el caso de las ciudades, el tamaño de los símbolos es proporcional a la población gracias al argumento symbols.size.

qtm(World, borders = NULL) + 
qtm(metro, 
    title = "Ciudades más populosas",
    symbols.size = "pop2010", 
    symbols.title.size= "Metropolitan Areas", 
    symbols.id= "name",
    format = "World")

También es posible representar gráficamente objetos puntuales, como pueden ser los volcanes de la Isla de Pascua. A continuación se realiza una representación básica de los volcanes.

qtm(volcanes)

Esta representación puede ser mejorada cambiando alguno de los elementos visuales. Por ejemplo, representando los volcanes como triángulos, cuyo tamaño dependerá de su altitud.

qtm(volcanes, 
    symbols.shape = 24,                                 # Tipo de símbolo: triángulo.
    symbols.size = "elevation",                         # Altitud proporcional a la variable altitud.
    title = "Volcanes")                                 # Título del gráfico.

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA G2040_02_Geovisualizacion_tmap 1

  1. Visualiza la estructura del objeto NLD_prov y comenta qué tipo de variables se encuentran en dicho objeto.
str(NLD_prov)
  1. Representa un mapa con las provincias de los Países Bajos.

  2. Representa la variable pop_25_44 (porcentaje de población entre 25 y 44 años) mediante un mapa de coropletas. Incluye el siguiente título: “Población adulta (%)”.

LAS FUNCIONES tm_shape()

Aunque la función qtm() es muy útil cuando se necesita un apoyo cartográfico inmediado, tmap() facilita la visualización al operar con un gran número de funciones y permitir la superposición de capas. Todas estas funciones tienen la misma sintaxis, componenzando con la expresión tm_().

Función Elemento Geometría
Funciones básicas
tm_polygons() polígonos (borders and fill) polígonos
tm_symbols() símbolos puntos, polígonos, líneas
tm_lines() lineas líneas
tm_raster() ficheros raster raster
tm_text() textos puntos, polígonos y líneas
tm_basemap() tile
tm_tiles() tile
Función Elemento Geometría
tm_borders() polígonos (bordes) polígonos
tm_fill() polígonos (relleno) polígonos
tm_bubbles() círculos puntos, polígonos y líneas
tm_dots() puntos puntos, polígonos y líneas
tm_markers() símbolos puntos, polígonos y líneas
tm_square() cuadrados puntos, polígonos y líneas
tm_iso() isolíneas líneas
tm_rgb()/tm_rgba() raster (RGB image) raster

Por ejemplo, en este caso:

tm_shape(volcanes) +
  tm_symbols(shape = 24, size = "elevation") +
  tm_layout(title = "volcanes")

Se interpreta como:

En general, la mayoría de las variables visuales pueden asignarse de dos formas principales.

Cuando se trabaja con diferentes capas, es conveniente estructurarlas en grupos. Un mapa puede tener varios grupos, y los elementos formales de cada capa/grupo sólo se relacionan con la llamada precedente en forma de tm_shape(). Veamos a continuación cuántas capas existen para cada grupo.

tm_shape(nz_limite) +
  tm_borders(col = "black", 
             lwd = 1) +
tm_shape(nz_elev) +
  tm_raster(title = "Altitud (m asl)", 
            style = "cont",
            palette = "-Spectral") +
tm_shape(nz_cumbres) + 
  tm_symbols(size = 0.2, col = "red") +
  tm_add_legend(type = "symbol", col = "red",
                title = "Cimas") + 
tm_scale_bar(breaks = c(0, 100, 200),
               text.size = 1) +
tm_compass(position = c("right", "top"),
             type = "rose", 
             size = 2) +
tm_credits(text = "Geog 2040") +
tm_layout(main.title = "Nueva Zelanda",
            bg.color = "lightblue",
            inner.margins = c(0, 0, 0, 0))  

El mapa contiene 3 grupos:

Además, el gráfico incorpora otros elementos visuales, que ayudan a los lectores del mapa y proporcionan información auxiliar:

Por defecto, la ubicación de estos tres elementos en el mapa se determina automáticamente. Sin embargo, puede ajustarse con el argumento position(). Además, es posible añadir otro tipo de leyenda con tm_add_legend().

MODALIDADES DE VISUALIZACIÓN

Cada mapa creado con tmap puede visualizarse de dos maneras diferentes:

tmap_mode("view")                               
tm_shape(nz_elev) +
  tm_graticules() + 
  tm_raster(title = "Elevation (m asl)", 
            style = "cont",
            palette = "-Spectral") +
tm_shape(nz_limite) +
  tm_borders(col = "black", 
             lwd = 1) +
tm_shape(nz_cumbres) +  
  tm_symbols(size = 0.2, col = "red") +
  tm_add_legend(type = "symbol", col = "red",
                title = "Highest peaks") +
tm_scale_bar(breaks = c(0, 100, 200), text.size = 1) + 
tm_layout(main.title = "New Zealand", 
            bg.color = "lightblue", 
            inner.margins = c(0, 0, 0, 0))

Para volver al modo «plot», tenemos que utilizar de nuevo la función tmap_mode():

tmap_mode("plot")

LOS ELEMENTOS FORMALES DE UN MAPA CON TMAP

Un mapa tiene que contar, como mínimo, con los siguientes elementos:

Elementos de un mapa
Elementos de un mapa

Algunos de estos elementos puede añadirse al mapa creado con tmap() mediante las siguientes funciones:

Función Descripción
tm_grid Añade una cuadrícula (canvas)
tm_graticules Añade una cuadrícula (canvas)
tm_credits Añade un texto (fuente)
tm_compass Añade un símbolo que representa el N
tm_scale_bar Añade una escala gráfica
Diseño1
Diseño1

Todas estas funciones se pueden combinar en un mapa, como aparece a continuación. Por ejemplo:

tm_shape(nz_elev) +
  tm_raster(title = "Elevación (m)", 
            style = "cont",
            palette = "-Spectral") +
tm_scale_bar(breaks = c(0, 100, 200),
               text.size = 1) +
tm_compass(position = c("right", "top"), 
             type = "rose", 
             size = 2) + 
tm_grid(col = "red") +
tm_credits(text = "G2024")
tm_shape(nz_elev) +
  tm_raster(title = "Elevación (m)", 
            style = "cont",
            palette = "-Spectral") +
tm_graticules(x = seq(166, 178, 2))
tm_shape(nz_elev) +
  tm_raster(title = "Elevación (m)", 
            style = "cont",
            palette = "-Spectral") +
tm_scale_bar(breaks = c(0, 100, 200),
             text.size = 1,
             position = c("left", "center")) +
tm_compass(position = c("right", "top"), 
             type = "4star",                                                    # Otro modelo diferente de señalar el N
             size = 4) + 
tm_grid() +
tm_credits(text = "G2024", position = c("right", "top"))                      # Fuente situada ahora en la esquina superior derecha
tm_shape(nz_elev) +
  tm_raster(title = "Altitud (m asl)", 
            style = "cont",
            palette = "-Spectral") +
tm_layout(main.title = "Nueva Zelanda",                                       # Título que se imprime sobre el mapa.
            title = "Primer mapa con {tmap}",                                 # Título impreso dentro del mapa.
            bg.color = "#add8e6")
tm_shape(nz_elev) +
  tm_raster(title = "Elevation (m asl)", 
            style = "cont",
            palette = "-Spectral") +
tm_layout(main.title = "Nueva Zelanda", 
            title = "ejercicio práctico",
            bg.color = "#add8e6",
            legend.show = FALSE)
tm_shape(nz_elev) +
  tm_raster(title = "Elevación (m)", 
            style = "cont",
            palette = "-Spectral") +
tm_layout(main.title = "Nueva Zelanda", 
            title = "Mi primer {tmap}",
            bg.color = "#add8e6",
            legend.outside = TRUE,
            frame = FALSE)
tm_shape(nz_elev) +
  tm_raster(title = "Elevación (m)", 
            style = "cont",
            palette = "-Spectral") +
  tm_layout(main.title = "Nueva Zelanda", 
            title = "ejercicio práctico",
            bg.color = "#add8e6",
            inner.margins = c(0.01, 0.01,
                              0.01, 0.2))

SIMBOLOGIA

Los símbolos suelen utilizarse para representar datos puntuales, pero también pueden emplearse para líneas y polígonos. En estos últimos casos, se sitúan en las coordenadas del centroide de elemento. tmap() posee una gran flexibilidad a la hora de dibujar los símbolos, por ejemplo, es posible mostrar los valores de una variable determinada mediante los colores de los símbolos, sus tamaños o sus formas.

tm_symbols() es la función principal que controla las características de los símbolos. Por defecto, dibuja un símbolo circular gris con un borde negro para cada elemento del fichero de entrada. Sin embargo, es posible simplificar el procedimiento añadiendo capas adicionales con las funciones tm_squares(), tm_bubbles(), tm_dots(), tm_markers(). En el ejemplo que se muestra a continuación cada símbolo está relacionado con una característica (fila) del objeto nz_cimas, utilizando la función tm_squares(), que aplica símbolos cuadrados (shape = 22) en lugar de círculos (shape = 21).

tm_shape(nz_limite) + 
  tm_fill() +
tm_shape(nz_cumbres) +
  tm_squares()
tm_shape(nz_limite) + 
  tm_fill() +
tm_shape(nz_aeropuertos) +
  tm_bubbles()

La función principal de tm_dots() es presentar muchas localizaciones al mismo tiempo. Para ello, esta capa tiene un valor de tamaño pequeño (0,02) por defecto.

tm_shape(nz_limite) + 
  tm_fill() +
tm_shape(nz_ciudades) +
  tm_dots()

La última capa adicional es tm_markers(), que utiliza un icono de marcador por defecto.

Lineas

La función tm_lines() permite visualizar distintos tipos de datos de líneas.

tm_shape(nz_limite) + 
  tm_fill() +
tm_shape(nz_carreteras) + 
  tm_lines(lwd = "scalerank")

Las líneas pueden presentarse con diferentes colores, anchuras o tipos. Esto permite mostrar una jerarquía (por ejemplo, mayores anchuras de línea para carreteras de mayor capacidad) o distinguir entre tipos de objetos (por ejemplo, ríos azules comparados con carreteras grises).

Etiquetas

Las etiquetas son una parte integrante de muchos mapas. Pueden cumplir varias funciones, desde identificar características, indicar relaciones entre ellas o representar los valores de una variable determinada. La función principal para crear etiquetas de texto en tmap es tm_text(), que añade una etiqueta a cada elemento presente en los datos.

Por ejemplo, a continuación se representarán únicamente los nombres de los volcanes de la Isla de Pascua, modificando el tamaño de la etiqueta en función de la altitud, para resaltar los más importantes. Por defecto, tmap emplea el tipo de letra “sans”; para cambiar este tipo letra es posible utilizar 3 alternativas.

Una primera, cambiar todas las fuentes y tipos de letra del mapa , utilizando los argumentos fontfamily() y fontface() de la función tm_layout(). Un ejemplo:

tm_shape(costa) +
  tm_polygons() +
tm_shape(volcanes) +
  tm_text(text = "name", size = "elevation") +
  tm_credits("Data source: OSM") + 
  tm_layout(main.title = "Volcanes de la Isla de Pascua",
            fontface = "italic",
            fontfamily = "serif", 
            legend.outside = TRUE)

Una alternativa es cambiar sólo algunos elementos del texto de manera independiente. Muchas de las funciones de tmap, como tm_text() o tm_credits() tienen sus propios argumentos fontfamily y fontface que pueden ser modificados. Por último, tm_layout() puede modifcar las fuentes empleadas en otras funciones usando argumentos tales como main.title.fontface o legend.title.fontfamily.

tm_shape(costa) +
  tm_polygons() +
tm_shape(volcanes) +
  tm_text(text = "name", size = "elevation", fontfamily = "sans") +
  tm_credits("Data source: OSM", fontface = "bold") +
  tm_layout(main.title = "Volcanes de la Isla De Pascua",
            main.title.fontface = "bold.italic", 
            legend.title.fontfamily = "monospace")

Con tmap es posible cambiar tanto colores (argumento col) como tamaños (argumento size) de las etiquetas proporcionando un único valor o el nombre de una variable de datos. También se pueden combinar mayúsculas o minúsculas («upper» o «lower»), sombreado (TRUE o FALSE) además del tipo y de la familia de la fuente (argumentos fontface y fontfamily). Las etiquetas de texto pueden añadirse a (multi)puntos, (multi)líneas y (multi)polígonos espaciales

GRÁFICOS SIMULTÁNEOS

tmap() permite el dibujo de varios mapas de manera simultánea a través de diferentes procedimientos

  1. Creando dos mapas y representándolos simultáneamente:
data("NLD_muni")
tm1 <- tm_shape(NLD_muni) + 
  tm_polygons("population", convert2density = TRUE)
tm2 <- tm_shape(NLD_muni) +
  tm_bubbles(size = "population")
tmap_arrange(tm1, tm2)

Este método se utiliza normalmente para mostrar dos variables totalmente diferentes. Sin embargo, también es posible mostrar variables que están relacionadas, como si fueran subconjuntos de los mismos datos:

NLD_muni$perc_men <- NLD_muni$pop_men / NLD_muni$population * 100
tm_shape(NLD_muni) +
  tm_polygons("perc_men", palette = "RdYlBu") +
  tm_facets(by = "province")

Esto se puede realizar también con otros tipos de mapas, por ejemplo, mapas de círculos proporcionales

tm_shape(metro) +
    tm_bubbles(size=c("pop1970", "pop2020"), title.size="Population") +
    tm_facets(free.scales=FALSE) +
tm_layout(panel.labels=c("1970", "2020"))

Observe que este trazado utiliza paneles y que la leyenda común se traza fuera de los mapas.

SALVAR Y EXPORTAR UN MAPA

Los mapas creados con tmap pueden guardarse como un objeto R. Esta es una característica útil, que permite utilizar un mapa en unos pocos lugares en un código, modificar objetos tmap existentes, o guardar estos objetos en archivos.

La función tmap_save() guarda nuestro mapa en tres grupos de formatos de archivo:

Para los ejemplos de esta sección, utilizaremos un mapa almacenado como objeto tm.

mapa_definitivo <- 
tm_shape(nz_elev) +
  tm_graticules() + 
  tm_raster(title = "Elevation (m asl)", 
            style = "cont",
            palette = "-Spectral") +
tm_shape(nz_limite) +
  tm_borders(col = "black", 
             lwd = 1) +
tm_shape(nz_cumbres) +  
  tm_symbols(size = 0.2, col = "red") +
  tm_add_legend(type = "symbol", col = "red",
                title = "Highest peaks") +

    tm_scale_bar(breaks = c(0, 100, 200), 
               text.size = 1) + 
  tm_compass(position = c("right", "top"), 
             type = "rose", 
             size = 2) + 
  tm_credits(text = "J. Nowosad, 2021") + 
  tm_layout(main.title = "New Zealand", 
            bg.color = "lightblue", 
            inner.margins = c(0, 0, 0, 0))

Este objeto gráfico puede ser visualizado.

mapa_definitivo

A continuación, este mapa se puede imprimir como fichero gráfico en formato *.png. Atención al lugar en el que se graba el fichero!!!. Cuanto imprimimos, la calidad es de 300 DPI, siendo la anchura y altura de la imagen ajustadas automáticamente por el programa. Estos parámetros pueden ser modificados por el autor.

Al igual que otros formatos en rejilla, las imágenes digitales se componen de muchos píxeles, cuadrados rellenos de colores específicos. Los principales formatos de gráficos rasterizados son PNG, JPEG, BMP y TIFF. Uno de los principales parámetros de las imágenes gráficas rasterizadas es DPI (puntos por pulgada, en este contexto, un nombre más apropiado probablemente debería ser PPI, píxeles por pulgada) - es un número de píxeles por pulgada de la imagen de salida. Por ejemplo, si la anchura y la altura de nuestra imagen son de 10 pulgadas, entonces DPI de 300 significaría que nuestra imagen final tendría 3000 por 3000 píxeles, y DPI de 72 resultaría en una imagen de 720 por 720 píxeles. Por lo tanto, una imagen con el mismo ancho y alto, pero mayor valor de DPI ocuparía más espacio del disco duro, pero también tendría mejor calidad.

TIPOS DE MAPAS CON TMAP

A continuación revisaremos algunos de los principales tipos de mapas que pueden elaborarse con tmap():

MAPA BASE

MAPAS CUANTITATIVOS

MAPAS CUALITATIVOS

OTROS MAPAS