Capítulo 4 Elaboración de Mapas en R

Hasta hace algún tiempo, la elaboración de mapas era una actividad casi exclusiva de los profesionales en geografía. Sin embargo, en los últimos años se han desarrollado una serie de herramientas que permiten a profesionales de otras áreas elaborarlos con alto nivel de calidad.

Los mapas se utilizan en una variedad de áreas del conocimiento para visualizar datos de una manera fácil y atractiva. Los mapas también permiten que el público tenga una mejor visión e información. Además, brindan contexto lo que facilita su comprensión.

Es fundamental que los mapas sean efectivos, lo que significa crear mapas que puedan ser fácilmente comprendidos por un público determinado. Los elementos básicos de un mapa incluyen:

  • Polígonos. Los polígonos son formas cerradas, como p.e. las fronteras de un país.
  • Líneas. Las líneas se consideran formas lineales que no están rellenas como carreteras, arroyos o carreteras.
  • Puntos. Los puntos se utilizan para especificar posiciones específicas, como la ciudad o ubicaciones de puntos de referencia.

En R existen múltiples opciones para la elaboración de mapas. A continuación veremos algunos de los principales métodos y programas.

4.1 Mapa01. Puntos de muestreo

El siguiente mapa es un gráfico sencillo donde se traza una línea sobre las coordenadas de puntos de muestreo de peces a lo largo de un río. El ejemplo proviene del libro Numerical Ecology with R. Se utiliza el set de datos Doubs.RData el cual contiene datos de abundancia de especies, ambientales y coordenadas geográficas.

spe <- read.csv ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/DoubsSpe.csv', row.names = 1)
env <- read.csv ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/DoubsEnv.csv', row.names = 1)
spa <- read.csv ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/DoubsSpa.csv', row.names = 1)#datos espaciales

plot(spa, asp = 1, type = "n", main = "Site Locations", xlab = "x coordinate (km)", ylab = "y coordinate (km)")
lines(spa, col = "light blue")#linea  (rio)
text(spa, row.names(spa), cex = 0.8, col = "red")# etiquetas sitios
4

Figure 4.1: 4

4.2 Mapa02. Mapas dinámicos

Mapa dinámico con el paquete googleVis. La principal función para la generación del mapa es gvisMap() la cual lee el dataframe y crea una salida de texto que hace referencia a la API de visualización de Google. Esta salida se incluye como que se una página web o como una página independiente. Para el ejemplo se utilizan lo datos del recorrido del huracán Andrew en 2012.

library(googleVis)
data(Andrew)

M1 <- gvisMap(Andrew, "LatLong" , "Tip",
              options=list(showTip=TRUE, showLine=TRUE, enableScrollWheel=TRUE,
                           mapType='hybrid', useMapTypeControl=TRUE,
                           width=800,height=400))
plot(M1) 

4.3 Mapa03. Mapas de superficie

Mapas de superficie usando el paquete plot3D

library(plot3D)
contour2D(volcano, lwd = 2, colkey = FALSE)
4

Figure 4.2: 4

image2D(volcano, clab = "m")
4

Figure 4.3: 4

persp3D(z = volcano, clab = "m", shade = 0.2)
4

Figure 4.4: 4

Mapas de superficie usando el paquete plotly

library(plotly)
plot_ly(z = volcano, type = "contour", contours = list(showlabels = TRUE)) %>%
  colorbar(title = "Elevacion")

Figure 4.5: 4

Mapas de superficie usando el paquete ggplot2

library(ggplot2)
library(reshape2)
library(ggtern)

volcano3d <- melt(volcano)
names(volcano3d) <- c("x", "y", "z")

ggplot(volcano3d) + 
  aes(x = x, y = y, z = z) + 
  geom_tile(aes(fill=z)) + 
  coord_equal() +
  geom_contour()+
  xlab("longitud")+ ylab("latitud")+ zlab("elevacion")+
  scale_fill_distiller(palette="Spectral", na.value="white") + 
  theme_bw()
4

Figure 4.6: 4

Mapas de superficie con diferentes escalas usando ggnewscale

library(ggnewscale)
library(ggplot2)
library(ggnewscale)

topography <- expand.grid(x = 1:nrow(volcano),y = 1:ncol(volcano))
topography$z <- c(volcano)

# puntos medicion
set.seed(42)
measurements <- data.frame(x = runif(30, 1, 80),y = runif(30, 1, 60),den = rnorm(30))

ggplot(mapping = aes(x, y)) +
  geom_contour(data = topography, aes(z = z, color = stat(level))) +
  scale_color_viridis_c(option = "D") +
  new_scale_color() +
  geom_point(data = measurements, size = 3, aes(color = den)) +
  scale_color_viridis_c(option = "A")
4

Figure 4.7: 4

4.4 Mapa04. Mapas de batimetría

Se utiliza el paquete marmap donde la función getNOAA.bathy() permite obtener los batimétricos de la NOAA con una resolución de hasta 1 grado. Ejemplo con datos de la Isla del Coco, Costa Rica, adaptado de https://www.molecularecologist.com/2015/07/03/marmap/

library(marmap)

bat <- getNOAA.bathy(-88,-81,5,12 ,resolution = 2)

# Paleta de colores
blues <- colorRampPalette(c("darkblue", "cyan"))
greys <- colorRampPalette(c(grey(0.4),grey(0.99)))

plot.bathy(bat,image = TRUE,land = TRUE,n=0,
           bpal = list(c(0, max(bat), greys(100)),
                       c(min(bat), 0, blues(100))))
4

Figure 4.8: 4

Otra opción de mapas batrimétricos se muestra a continuación

library(marmap)

blues <- c("lightsteelblue4", "lightsteelblue3", "lightsteelblue2", "lightsteelblue1")
greys <- c(grey(0.6), grey(0.93), grey(0.99))

plot(bat, image = TRUE, land = TRUE, lwd = 0.1, bpal = list(c(0, max(bat), greys), c(min(bat), 0, blues)))
4

Figure 4.9: 4

4.5 Mapa05. Mapas con ggplot2

Se pueden realizar mapas en ggplot2, el cual tiene funciones del programa sf. Las características simples (simple features) son una forma estandarizada de codificar datos vectoriales espaciales (puntos, líneas, polígonos) en sistemas computacionales. El paquete sf implementa características simples en R.

El siguiente ejemplo es una adaptación de https://www.r-spatial.org/r/2018/10/25/ggplot2-sf.html

library("ggplot2")
library("ggspatial")
library("sf")
library("tmap")
library("rnaturalearth")
library("rnaturalearthdata")

world <- ne_countries(scale = "medium", returnclass = "sf")#baja datos paises

ggplot(data = world) +
  geom_sf(aes(fill = pop_est)) + #agrega geometría de objetos
  scale_fill_viridis_c(option = "plasma", trans = "sqrt")+
  xlab("Longitud") + ylab("Latitud") +
  ggtitle("Mapa Mundial")+
  labs(fill = "Poblacion")+
  theme_bw()
4

Figure 4.10: 4

A los mapas se les pueden incluir anotaciones además de la escala y el símbolo de la rosa de los vientos.

library(ggplot2)
library("ggspatial")
ggplot(data = world) +
  geom_sf() +theme_bw()+
  annotation_scale(location = "bl", width_hint = 0.5) +
  annotation_north_arrow(location = "bl", which_north = "true", pad_x = unit(0.5, "in"), pad_y =unit(0.5,"in"), style = north_arrow_fancy_orienteering) +
  coord_sf(xlim = c(-102, -74), ylim = c(6, 32))
4

Figure 4.11: 4

4.6 Mapa06. Mapas con ggmap

El paquete ggmap es actualmente una de las herramientas más versátiles para la generación de mapas. El paquete ggmap facilita la recuperación de mosaicos de mapas ráster de servicios populares de mapas en línea, los cuales luego pueden ser graficados utilizando ggplot2.

Entre las funciones más importantes están get_stamenmap() que permite bajar mapas de Stamen Maps, los cuales son gratis, mientras que la función get_map() permite bajar mapas de Google Maps. Para usar esta última función, se deberá configurar una clave API para Google Maps que en casos de uso excesivo podría tener un costo asociado.

En el siguiente link se encuentra el cheatsheet del paquete.

Para el ejemplo generamos un set de datos de coordenadas aleatorio.

library(ggmap) 
library(dplyr)
library(ggsn)

GeoCR = data.frame(x=(runif(10)+9.5), y=(runif(10)+(84.5)*-1))
GeoCR$id<- paste0("sp", 1:nrow(GeoCR))
colnames(GeoCR) <- c("lat", "lon","sp")
GeoCR
#>          lat       lon   sp
#> 1   9.894441 -84.30301  sp1
#> 2  10.178593 -83.96476  sp2
#> 3  10.275825 -84.32044  sp3
#> 4   9.687869 -84.04811  sp4
#> 5   9.529086 -84.18295  sp5
#> 6   9.635714 -84.38383  sp6
#> 7  10.180164 -84.31390  sp7
#> 8  10.434823 -83.77027  sp8
#> 9  10.050494 -84.08813  sp9
#> 10 10.101766 -84.08595 sp10

Bajamos el mapa base

map <- get_stamenmap(bbox = c(left = -86.05, bottom = 9.47, right = -83.1,
                               top = 11.24), maptype = "terrain-background", 
                      color = "color")
ggmap(map,extent = "panel")
4

Figure 4.12: 4

Y ahora generamos el gráfico en ggplot2

ggmap(map) +
  geom_point(data = GeoCR, aes(x = lon, y = lat),colour = "white") +
  geom_text(data = GeoCR,aes(x = lon, y = lat, label = sp),
    colour = "black",size=3,vjust = 0.5,hjust =-0.3,fontface = "bold")+
  labs(x = "Longitude", y = "Latitude")+
  theme_bw()
4

Figure 4.13: 4

4.7 Mapa07. Combinación de mapas

Para combinar mapas se utiliza la función ggdraw() del paquete cowplot. Los elementos del recuadro se ubican en eje de coordenadas de 0,0 a 1,1. Haremos un mapa de Costa Rica con un recuadro señalando la ubicación del país en Centro América.

library("cowplot")

g1<-ggplot(data = world) +
    geom_sf(fill= "antiquewhite") +
    geom_point(data = GeoCR, aes(x=lon, y=lat), size=1.5)+
    xlab("Longitud") + ylab("Latitud") + 
    annotation_scale(location = "tr", width_hint = 0.25) +
    coord_sf(xlim = c(-86.5, -82), ylim = c(7.5, 11.5), expand = FALSE)+
    theme(panel.grid.major = element_line(color = gray(.5), linetype = "dashed", size = 0.5), panel.background = element_rect(fill = "aliceblue"))

g2<-ggplot(data = world) +
    geom_sf() +   
    scale_x_continuous(expand=c(0,0)) + #recortar ejes
    scale_y_continuous(expand=c(0,0)) + 
    geom_rect(xmin = -86.5, xmax = -82, ymin = 7.5, ymax = 11.5, 
              fill = NA, colour = "black", size = 1.5) +
    coord_sf(xlim = c(-95, -75), ylim = c(6, 20), expand = FALSE)+
    theme(panel.background = element_rect(colour = "black",size = 1),
          panel.grid.major = element_line(color = gray(.9), linetype = "dashed", size = 0.1),
          axis.text.x = element_blank(),
          axis.text.y = element_blank(),
          axis.ticks = element_blank())

ggdraw(g1) + draw_plot(g2, width = 0.35, height = 0.35, x = 0.25, y = 0.15)
4

Figure 4.14: 4


Ejercicio 1. Elabore un mapa para mostrar el origen de algunos hongos endófitos aislados en parques nacionades de Costa Rica (similar al adjunto). Utilice de base el tipo de mapa “terrain-background” de la base de datos Stamen Maps. Incluya además en un recuadro de Centro América donde se muestre el país. El dataframe con las coordenadas de los aislamientos y las coordenadas para encuadrar todo el país se presentan a continuación:

hongos <- data.frame(aislamiento=c("1092G","710D","100A","102A","1211D","1119D"),
                   lat=c(10.14111111,9.586305556,9.84111,9.770333333,10.93425,10.62038889),
                   lon=c(-84.09327778,-85.09377778,-84.60830556,-84.60816667,-85.45052778,-84.99283333))

Costa Rica = c(left = -86.5, bottom = 7.5, right = -82, top = 11.5)

Solución de ejercicios

Ejercicio 1

library(ggmap) 
library(dplyr)
library(ggsn)
library("cowplot")

bbox = c(left = -86.5, bottom = 7.5, right = -82, top = 11.5)
map <- get_stamenmap(bbox, maptype = "terrain-background", zoom = 8) 

hongos <- data.frame(aislamiento=c("1092G","710D","100A","102A","1211D","1119D"),lat=c(10.14111111,9.586305556,9.84111,9.770333333,10.93425,10.62038889),lon=c(-84.09327778,-85.09377778,-84.60830556,-84.60816667,-85.45052778,-84.99283333))

p1= ggmap(map) +
  geom_point(data = hongos, aes(x = lon, y = lat),colour = "white") +
  geom_text(data = hongos,aes(x = lon, y = lat, label = aislamiento),
            colour = "black",size=3,vjust = 0.5,hjust =-0.3,fontface = "bold")+
  labs(x = "Longitude", y = "Latitude")+
  theme_bw()

p2=ggplot(data = world) +
  geom_sf() +   
  scale_x_continuous(expand=c(0,0)) + 
  scale_y_continuous(expand=c(0,0)) + 
  geom_rect(xmin = -86.5, xmax = -82, ymin = 7.5, ymax = 11.5, 
            fill = NA, colour = "black", size = 1) +
  coord_sf(xlim = c(-95, -75), ylim = c(6, 20), expand = FALSE)+
  theme(panel.grid.major = element_line(color = gray(1), linetype = "dashed", size = 0.5), 
        panel.background = element_rect(fill = "aliceblue"),
        axis.text.x = element_blank(),axis.text.y = element_blank(),axis.ticks = element_blank())

ggdraw(p1) + draw_plot(p2, width = 0.25, height = 0.25, x = 0.24, y = 0.15)