12 Mapas

Son muchos los paquetes relacionados a GIS en R con multiplicidad de funciones

library(tidyverse)
library(viridis)

Obtención de datos georeferenciaodos

remotes::install_gitlab("dickoa/rgeoboundaries")
library(rgeoboundaries)
library(raster)
library(rnaturalearth)
# install.packages("rnaturalearthdata")

Generacion de mapas con sintaxis acoplable a ggplot

library(sf)
library(leaflet)
library(htmltools)
library(ggspatial)

Hay otros muy interesantes como tmap, mapview que pueden encontrar mucha informacion en internet

12.1 Paquete sf

Obtenemos limites politicos de Africa

africa <- ne_countries(continent = "Africa", returnclass = "sf", scale = "medium")
africa

Primer grafico

africa %>%  
  ggplot()+
  geom_sf() 
africa %>%  
  ggplot()+
  geom_sf() +
  coord_sf(crs = st_crs("ESRI:54030"))   # Robinson
africa %>%  
  ggplot()+
  geom_sf() +
  coord_sf(crs = st_crs("EPSG:3395"))   # Mercator

Manipualacion con dplyr

head(africa)
zambia <- africa %>% filter(sovereignt=="Zambia")
zambia %>%  
  ggplot()+
  geom_sf()

Una capa por dataframe

africa %>%  
  ggplot()+
  geom_sf() + 
  geom_sf(data=zambia, fill="gray50")

Obtenemos limites provinciales con rgeoboundaries

zambia_adm1 <- geoboundaries(c("Zambia"), "adm1")
zambia_adm1 %>% 
ggplot() +
  geom_sf()
zambia_adm2 <- geoboundaries(c("Zambia"), "adm2")
zambia_adm2
zambia_adm2 %>% 
ggplot() +
  geom_sf() #+ 
  # geom_sf_text(aes(label = shapeName), size=2)
  # coord_sf(xlim = c(22, 30),  ylim = c(-10, -16))

Hasta ahora veniamos con graficos estáticos

Veamos uno dinámico con leaflet

library(htmltools)

zambia_adm2 %>%
  leaflet() %>%
  addTiles() %>%
  addPolygons(label = zambia_adm1$shapeName, weight=1, popup = ~htmlEscape(shapeID))

12.2 Choropleth maps

Agreguemos una variable ficticia

zambia_adm1 <- zambia_adm1 %>% 
  mutate(y=rnorm(10, 1000, 200))

zambia_adm1 %>% 
  ggplot() +
  geom_sf(aes(fill=y)) +
  scale_fill_viridis(direction=-1) 
  # scale_fill_viridis(option = "plasma") 

Por ejemplo, podemos practicar esto mismo con datos reales poblacionales con el paquete wopr

12.3 Mapa de clima

https://rspatialdata.github.io/temperature.html

Descarguemos temperatura maxima mensual con raster

tmax_data <- getData(name = "worldclim", var = "tmax", res = 10)
# Converting temperature values to Celcius
gain(tmax_data) <- 0.1
# Calculating mean of the monthly maximum temperatures
tmax_mean <- mean(tmax_data)

Extraemos los datos de zambia

tmax_mean_zam <- raster::mask(tmax_mean, as_Spatial(zambia_adm1))

Converting the raster object into a dataframe

tmax_mean_zambia_df <- as.data.frame(tmax_mean_zam, xy = TRUE, na.rm = TRUE)
tmax_mean_zambia_df %>%
  ggplot(aes(x = x, y = y)) +
  geom_raster(aes(fill = layer)) +
  geom_sf(data = zambia_adm1, inherit.aes = FALSE, fill = NA) +
  labs(
    title = "Mean monthly maximum temperatures in zambia",
    subtitle = "For the years 1970-2000"
  ) +
  xlab("Longitude") +
  ylab("Latitude") +
  scale_fill_gradient(
    name = "Temperature (°C)",
    low = "#FEED99",
    high = "#AF3301"
  )

12.4 Mapa de Muestreos

Supongamos que queremos plotear muestreos de especies realizados entre 2020 y 2021 en las provincias de Misiones y Corrientes

  • Descargamos limites politicos a nivel de municipiocon raster
# arg_adm2 <- geoboundaries(c("Argentina"), "adm2")
# arg_adm2

mis_corr  <-  getData(country = "ARG", level = 2) %>% 
  st_as_sf() %>% 
  filter(NAME_1 %in% c("Misiones", "Corrientes")) %>% 
  st_transform(crs = 4326)
mis_corr
mis_corr %>% 
  ggplot() + 
  geom_sf() +
  theme_minimal()

Generamos 120 puntos de muestreo aleatorios, donde solo registramos su especie (A o B), las coordenadas y el tamaño del especimen (media=10, sd=2)

sampling_points <- 
  expand_grid(year=as.integer(2020:2021), sp=LETTERS[1:2], rep=1:30)
sampling_points

sampling_points <- sampling_points %>% 
  mutate(coord=st_sample(mis_corr, 120),    
         size = rnorm(120, 10, 2)) %>% 
  st_sf()  
sampling_points

Ahora queremos fusionar con el dataset con los municipios donde cayeron los puntos de muestreo

sampling_points_muni <- st_join(sampling_points, mis_corr)
sampling_points_muni

Veamos que tal cayeron los puntos

ggplot()+
  geom_sf(data=mis_corr)+
  geom_sf(data=sampling_points, aes(col=sp))+
  facet_wrap("year") + 
  theme_void()
      # theme_map() 

Y si hubo algun patron en el tamaño de los especimenes registrados

ggplot()+
  geom_sf(data=mis_corr, col="gray70")+
  geom_sf(data=sampling_points, aes(color=size))+
  facet_grid(sp~year) +
  scale_color_viridis_c() +
  theme_minimal()

Y algunos graficos con medidas aritmeticas

sampling_points_muni %>%  
  count(year, NAME_1, sp) %>% 
  ggplot() + 
  aes(x=year, y=n, col=sp) +
  geom_line() +
  facet_wrap("NAME_1")
sampling_points_muni %>%  
  count(NAME_1, NAME_2, sp) %>% 
  ggplot() + 
  aes(x=NAME_2, y=n, fill=sp) +
  geom_bar(position="stack", stat="identity") + 
  facet_wrap("NAME_1", scales = "free")+
  coord_flip()

Y si no nos interesa los municipios y tenemos los datos exprtados de una planilla de excel…

El paquete ggspatial nos provee un mapa base

samp_xls <- sampling_points %>% 
  mutate(lon = sf::st_coordinates(.)[,1],
               lat = sf::st_coordinates(.)[,2]) %>% 
  as_tibble() %>%  
  dplyr::select(-coord)

samp_xls

samp_xls %>% 
  ggplot(aes(x = lon, y = lat, col=sp)) +
  annotation_map_tile(type = "cartolight",
                      zoomin = 0) +
  geom_spatial_point() +
  # ylim(c(-52, 40)) +
  # xlim(c(-115, -40)) +
  facet_wrap("year") + 
  guides(size="none") + 
  coord_sf(crs = 4326)
library(sf)

cities <- data.frame(
  longitude = c(-58.3612, -58.3173, -58.2940, -58.7228, -57.9556, -58.2395), 
  latitude  = c(-38.0165, -37.9428, -37.5447, -37.6301, -37.8666, -37.6467), 
  city = c("San Agustin", "Los Pinos", "Ramos Otero", "Napaleofu", "La Brava", "Bosch")
) 
cities %>% 
ggplot( aes(longitude, latitude)) +
  annotation_map_tile(zoom = 10) +
  geom_spatial_point() +
  geom_spatial_label_repel(aes(label = city))+
  fixed_plot_aspect() 

# coord_sf(crs = 3995)

Referencias

library(rgeoboundaries)
# https://rspatialdata.github.io/admin_boundaries.html

library(rnaturalearth)
# https://docs.ropensci.org/rnaturalearth/articles/rnaturalearth.html

library(sf)
# https://keen-swartz-3146c4.netlify.app/

library(ggspatial)
# https://paleolimbot.github.io/ggspatial/

library(rworldmap)
# https://bookdown.org/angelborrego/ciencia_datos/mapas.html#mapas-con-rworldmap

library(pointdensityP)
# https://mgimond.github.io/Spatial/chp11_0.html
Drummond, GB, and SL Vowler. 2011. “Show the Data, Don’t Conceal Them.” British Journal of Pharmacology 163 (2): 208–10. https://doi.org/10.1111/j.1476-5381.2011.01251.x.
Ellison, GN, and NJ Gotelli. 2004. “A Primer of Ecological Statistics.” Sinauer, Sunderland, Massachusetts, USA.
R Core Team. 2017. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Weissgerber, Natasa M. AND Winham, Tracey L. AND Milic. 2015. “Beyond Bar and Line Graphs: Time for a New Data Presentation Paradigm.” PLOS Biology 13 (4): 1–10. https://doi.org/10.1371/journal.pbio.1002128.
Wickham, Hadley, and Garrett Grolemund. 2016. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. " O’Reilly Media, Inc.". http://r4ds.had.co.nz/.