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.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.
4.3 Mapa03. Mapas de superficie
Mapas de superficie usando el paquete plot3D
image2D(volcano, clab = "m")
persp3D(z = volcano, clab = "m", shade = 0.2)
Mapas de superficie usando el paquete plotly
library(plotly)
plot_ly(z = volcano, type = "contour", contours = list(showlabels = TRUE)) %>%
colorbar(title = "Elevacion")
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()
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.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))))
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.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()
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.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")
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.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)
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:
<- data.frame(aislamiento=c("1092G","710D","100A","102A","1211D","1119D"),
hongos 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))
= c(left = -86.5, bottom = 7.5, right = -82, top = 11.5) Costa Rica
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)