Creación de gráfico compuesto con ggplot2 en R – Climatograma y mapa de localización

Este tutorial hace parte del vídeo en mi canal de YouTube, el cuál puedes ver aquí:

Para descargarlos datos climáticos de Worldclim puedes visitar la página web (clic aquí).

El código lo puedes acceder en mi cuenta de Github (clic aquí). Y por último los datos los puedes descargar aquí (shapefiles)

Recuerda por favor este post en tu red social favorita, para que esta comunidad de R siga creciendo.

Los datos

https://www.worldclim.org/data/worldclim21.html

Cálculo de tiempo y distancia entre dos lugares con el uso de R

Este tutorial hace parte de un vídeo que ya está publicado en mi canal de YouTube.

El resultado final será el siguiente:

Puede ser una imagen de mapa y texto que dice "Ruta desde Cali a Cartago- Valle del Cauca Tiempo estimado: 154.3 minutos istancia: 190.8348 km Risaralda 4.5°N rtago Quindio Latitude 4.0°N 3.5°N 77.0W 76.5°W Longitude 76.0°W Elaboró Fabio Castro"

Para acceder al código de R visita el siguiente enlace:

https://github.com/fabiolexcastro/tutorials_youtube/blob/master/CalculoDistances/01%20calculo%20distancia%20tiempo.R

Y para descargar los datos necesarios para la replica del ejercicio, visita este enlace.

Compartir…

Curso modelos de distribución de especies

El curso será únicamente en el lenguaje de programación de R a partir del uso de la interfaz de RStudio (IDE).

Se aconseja previamente hacer la instalación de las siguientes librerías dentro de R, así como también utilizar la última versión de R (4.1.1.)

install.packages('pacman') 
library(pacman)
pacman::p_load(raster, rgdal, rgeos, stringr, sf, tidyverse, terra, ade4, ncdf4, dismo, ENMeval, rJava, readxl, caret, randomForest, hablar, imputeTS, sp, gtools, foreach, furrr, future, doSNOW, leaflet, DT, dplyr, leaflet.extras, htmltools, crosstalk, rgdal, openxlsx, png, virids, tibble, mapedit, cptcity, ggspatial, RGBIF, hrbrthemes, mapedit, plotply, broom)

Módulo 1.

Repaso en general de R. Aquí se tendrán las siguientes clases:

  • Tipos de objetos, guía de estilo y creación de proyecto más estructura del espacio de trabajo.
  • Lectura y tratamiento de información tipo tabular, distintos tipos de uniones y operaciones entre tablas / dataframes
  • Lectura de objetos espaciales tales como archivos shapefile, raster, estructuras nc, extracción por máscara, clip, dissolve, projection, entre otros.
  • Creación de funciones, aplicación de condicionales, y ciclos generales, conceptos de lapply, sapply, tapply, apply
  • Creación de distintos tipos de gráficos con la librería base de R
  • Creación de gráficos avanzados con ggplot2, boxplot, barras, scatterplot, líneas, tendencias

Módulo 2.

Variables ambientales / climáticas / topográficas

  • Disponibilidad de variables climáticas, bases de datos, worldclim, terraclimate, CRU (Climate Research Unite)
  • Creación de variables bioclimáticas
  • Generación de nuevas variables bioclimáticas, meses consecutivos secos, cantidasd de meses con precipitación mayor a cierto umbral
  • Descarga de modelos de elevación digital
  • Generación de covaribales del terreno, tales como pendiente, aspecto, hillshade
  • Métodos de downscaling GWR, aplicación a variables climáticas
  • Bases de datos de cambio climático, descarga de datos del IPCC,
  • Disponibilidad de datos de suelos, generación de variable de textura del suelo a partir del uso de SAGA
  • Normalización de datos raster que provienen de distintas fuentes de datos, álgebra de mapas
  • Bases de datos que contienen datos de presencias, página web de GBIF y uso de la librería RGBIF

Módulo 3

  • Preprocesamiento de información espacial de especies, eliminación de duplicados por celda, creación de zonas de incidencia (buffer).
  • Generación de datos de pseudo-ausencias, tipos de técnicas, bias sampling background
  • Aplicación de modelos de máxima entropía, estructura y organización del ordenador para el modelo (rJava, Java, dismo)
  • Generación de mapas binarios de idoneidad y no idoneidad a partir de distintos umbrales (Sensibilidad y especificidad)
  • Aplicación de modelos de RandomForest para la estimación de zonas agroclimáticas, generación de clústers, concepto de gradiente de impacto.
  • Generación de capa de incertidumbre, ¿Qué tanto puedo confiar en mi modelo?
  • Proyección de superficies de idoneidad a futuro con máxent y random forest
  • Estimación de diferencias en las superficies de idoneidad para especies de fauna y flora
  • Cálculo del área idónea
  • Salidas gráficas de los mapas de idoneidad, comparación entre distintos periodos de tiempo
  • Generación de mapas avanzados, mapas de macrolocalización

¿Cómo descargar información de GBIF usando R?

Muchas investigaciones se realizan en identificar cuál es el impacto del cambio climático sobre ciertas especies tanto animales como vegetales, dentro de los métodos para dichas investigaciones se encuentran MaxEnt y Random Forest, para hacer tales modelaciones se hace necesario contar con presencias de la especie a modelar. GBIF (Global Biodiversity Information Facility) es una plataforma que cuenta con cientos de miles de registros de presencias tanto de flora como de fauna, estos registros en su mayoría cuentan con las coordenadas geográficas que pueden ser de uso para realizar el tipo de investigaciones mencionado anteriormente.

Para hacer la descarga de tales registros se puede hacer de varias maneras, una de ellas es haciendo el respectivo registro en la página web (requiere usuario y contraseña), y luego introduciendo el nombre científico de la especie nos arroja el resultado de todos los registros, sin embargo, en muchas ocasiones el hacer la descarga se demora desde pocos minutos hasta varias horas (dependiendo del número de registros). Otro camino para descargar la información es hacer uso de la libreria RGBIF del lenguaje de programación R, aquí es mucho más rápido hacer la descarga de información, sumado a que ya tendríamos la tabla cargada en R para hacer depuración de datos, análisis exploratorio espacial, entre otros.

En este tutorial entonces se explicara como hacer la descarga de registros de la especie Musa paradisiaca haciendo uso de R, y luego como obtener unicamente los registros localizados en el país de Colombia.

Se sugiere tener un nivel básico en el manejo de R para realizar el ejercicio, sin embargo, se espera ser lo más claro posible para que pueda ser replicado sin mayor problema. Se require tener instalado el software R Studio.

Cómo primer paso se descarga la libreria de RGBIF, tambien se instalara la libreria Tidyverse (para hacer manejo de la tabla de una manera más facil).

install.packages('rgbif')
install.packages('tidyverse')
library(rgbif)
library(tidyverse)

Ahora se hará la respectiva descarga de los datos para la especie Musa Paradisiaca (conocida popularmente como banano).

occ <- occ_data(scientificName = 'Musa paradisiaca L.', 
limit = 200000,
hasCoordinate = TRUE,
hasGeospatialIssue = FALSE)

Ahora conoceremos los nombres de las columnas. Las tablas descargadas de RGBIF siguen la estructura de darwin core (conocer más de este formato aquí).

colnames(occ$data)

Una de las columnas incluye el nombre del país (country), entonces, con base en esta columna haremos el respectivo filtro para obtener los registros localizados unicamente en Colombia.

occ_col <- filter(occ$data, country == 'Colombia')

Con esto entonces, el objeto occ_col contiene unicamente las presencias de la especie Musa Paradisiaca para el país de Colombia. Ahora hacemos la descarga del shapefile de los departamentos de Colombia, y se procede a la realización de un mapa sencillo, para visualizar en donde se encuentran los puntos de Musa paradisiaca en Colombia según esta base de datos de GBIF.

shp <- raster::getData('GADM', country = 'COL', level = 1)

gg <- ggplot() +
geom_point(data = occ_col, aes(x = decimalLongitude, y = decimalLatitude), color = 'black') +
geom_polygon(data = shp, aes(x = long, y = lat, group = group), color = 'grey', fill = NA) +
coord_fixed(ylim = c(-5, 12.5), xlim = c(-80, -67)) +
xlab('Longitud') +
ylab('Latitud')

ggsave(plot = gg, filename = 'myMap.png', units = 'cm', width = 12, height = 16, dpi = 300)

Ahora finalizamos haciendo la escritura de la tabla en nuestro espacio de trabajo:

write.csv(occ_col, 'occ_musa_paradisiaca.csv', row.names = F)

El mapa que generamos con el objeto gg debería ser similar al siguiente:

Creando un mapa en R

Hola a todos!

En este tutorial realizaremos un mapa de una variable continua en R, en el cuál utilizaremos archivos espaciales tipo raster, y shapefile. Este mapa representará la ubicación geográfica de estaciones meteorológicas de precipitación, así como tambien la temperatura promedio para el departamento del Valle del Cauca. En caso que quiera replicar el ejercicio puede descargar los datos aquí.

Aquí se hacen uso de algunos comandos como filter, select, extract, which, getData.

El primer paso a realizar es cargar las librerias, aquí usamos el comando p_load de la libreria pacman para cargar varias librerias en una sola línea, además, en caso que la libreria no encuentre instalada, ésta se instalará automaticamente.

require(pacman)
pacman::p_load(raster, rgdal, tidyverse, rgeos, gtools, stringr, foreign)

El segundo paso es cargar la tabla con las coordenadas geográficas de las estaciones de Worldclim.

wcs <- read.dbf('_dbf/wc_tean_stations.dbf')

Como tercer paso esta descargar el límite administrativo del Colombia a nivel administrativo 1 y 2.

col <- raster::getData('GADM', country = 'COL', level = 1)
col2 <- raster::getData('GADM', country = 'COL', level = 2)
tmn <- raster::getData('worldclim', var = 'tmean', res = 0.5, lon = coordinates(vll)[[1]], lat = coordinates(vll)[[2]])

El cuarto paso es realizar la extracción por máscara unicamente para el Valle del Cauca; pues los datos descargados corresponden a una ventana que contiene todo Colombia y algunos países centroamericanos.

vll <- col[col@data$NAME_1 %in% 'Valle del Cauca',]
vl2 <- co2[co2@data$NAME_1 %in% 'Valle del Cauca',]
tmn <- raster::crop(tmn, vll) %>% raster::mask(vll)

Ahora si realizamos un plot sencillo de los datos raster podemos observar que hay una grande zona en la que no hay datos, aquí se podría hacer una exclusión de estos datos NA del raster, siguiendo este proceso:

plot(tmn)
xNA <- is.na(tmn)
colNotNA <- which(colSums(xNA) != nrow(x))
rowNotNA <- which(rowSums(xNA) != ncol(x))
croppedExtent <- extent(tmn,
r1 = rowNotNA[1],
r2 = rowNotNA[length(rowNotNA)],
c1 = colNotNA[1],
c2 = colNotNA[length(colNotNA)])
tmncut <- raster::crop(tmn, croppedExtent)

Ahora bien, procedemos a realizar el calculo del promedio de la temperatura de los 12 meses del año y a su vez se divide el raster entre 10 (pues los datos en crudo vienen multiplicados por 10), esto mediante las siguientes  dos líneas de comando.

tmn.avg <- mean(tmncut)
tmn.avg <- tmncut / 10

El siguiente paso es hacer el filtro de las estaciones climáticas únicamente para Colombia, a su vez solo escogemos las columnas country, name, long y lat.

wcs <- wcs %>% 
as.tibble() %>%
dplyr::filter(COUNTRY == 'COLOMBIA') %>%
dplyr::select(COUNTRY, NAME, LONG, LAT)

Ahora el siguiente paso es realizar la extracción de los nombres de los departamentos para las estaciones, para eso hacemos uso del shape de nivel administrativo 2 así como tambien de la tabla de las estaciones meteorológicas

wcs <- raster::extract(co2, wcs[,c('LONG', 'LAT')]) %>% dplyr::select(NAME_1, NAME_2) %>% cbind(wcs, .) 
wcs <- wcs %>% dplyr::filter(NAME_1 == 'Valle del Cauca')

Ahora sí, procedemos a realizar el mapa haciendo uso de funciones de la libreria ggplot.

gg <- rasterVis::gplot(tmn.avg) +
geom_tile(aes(fill = value)) +
scale_fill_gradientn(colours = RColorBrewer::brewer.pal(n = 8, name = "YlOrRd"), na.value = 'white') +
labs(fill = '') +
geom_polygon(data = vl2, aes(x=long, y = lat, group = group), color = 'grey', fill='NA') +
geom_polygon(data = col, aes(x=long, y = lat, group = group), color = 'grey', fill='NA') +
coord_equal(xlim = c(-77.6, extent(vl2)[2]), ylim = extent(vl2)[3:4]) +
xlab('Longitud') +
ylab('Latitud') +
theme_bw() +
theme(panel.background = element_rect(fill = 'white', colour = 'black'),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = 'top')

gg <- gg +
geom_point(data = wcs, aes(x = LONG, y = LAT), col = 'blue')

Sí queremos visualizar el mapa escribimos

gg

Por último, procedemos a hacer el guardado de nuestro mapa:

ggsave(plot = gg, filename = 'myMap.png', unit = 'in', width = 9, height = 7, dpi = 300)