Hacer gráfica en R de precipitación a partir de archivos raster por departamento



En este tutorial explicare brevemente como realizar un gráfico tipo ojiva, en el cual se presente en el eje x los meses del año & en el eje y la precipitación acumulada para cada mes, a tres distintos departamentos de Colombia, estos son: Antioquía, Cundinamarca y Valle del Cauca. Los datos de entrada fueron tomados de la base de datos Worldclim (Hijmans et al., 2005) y extraídos para Colombia a partir del shape de límite departamental del SIGOT.

Los datos utilizados en este tutorial están disponibles en este enlace, y se describen a continuación:

1) 12 raster de precipitación para todo Colombia a resolución de 30 arcos de segundo (aproximadamente 1 km2)
2) Shapefile de los 32 departamentos de Colombia.

A continuación se describen los pasos, asumiendo que ya se tiene instalado R y RStudio en su computador.

1. Instalamos las siguientes librerías (importante tener conexión a Internet)

install.packages("raster")
install.packages("rgdal")
install.packages("ggplot2")
install.packages("dplyr")
install.packages("reshape2")

require("raster")
require("rgdal")
require("ggplot2")
require("dplyr")
require("reshape2")

2.  Llamamos nuestros datos en RStudio



myproj <- CRS("+proj=longlat +datum=WGS84") #proyección a utilizar
path   <- "E:/Blogs/_blogger/_graphClimate" #dirección donde está el directorio raíz de los datos
col_shp <- shapefile(paste0(path, "/_shp/LimiteDptal.shp")) # limite departamental
files  <- list.files(paste0(path, "/_climate/_colombia/_asc"), full.names = T, pattern = ".asc$") #archivos raster

 3. Escogemos en nuevos objetos los departamentos de interés


valleCauca_shp <- col_shp[col_shp$NOMBRE_DPT %in% "VALLE DEL CAUCA",]
cundinamarca_shp <- col_shp[col_shp$NOMBRE_DPT %in% "CUNDINAMARCA",]
antioquia_shp <- col_shp[col_shp$NOMBRE_DPT %in% "ANTIOQUIA",]

4. Archivos raster


files_prec <- grep("prec", files, value = T) %>%
              mixedsort() #seleccion de precipitación y ordenar datos
layers_prec <- lapply(files_prec, raster) #conversión de objetos a raster


5. Corte de archivos raster por departamento, se crean listas vacías donde se guardaran los raster para cada departamento.

prec_antioquia    <- list() #creación de lista vacía
prec_cundinamarca <- list() #creación de lista vacia
prec_valle        <- list() #creación de lista vacia

for(i in 1:length(layers_prec)){

  prec_antioquia[[i]] <- crop(layers_prec[[i]],    antioquia_shp)
  prec_antioquia[[i]] <- mask(prec_antioquia[[i]], antioquia_shp)

  prec_cundinamarca[[i]] <- crop(layers_prec[[i]], cundinamarca_shp)
  prec_cundinamarca[[i]] <- mask(prec_cundinamarca[[i]], cundinamarca_shp)

  prec_valle[[i]] <- crop(layers_prec[[i]], valleCauca_shp)
  prec_valle[[i]] <- mask(prec_valle[[i]],  valleCauca_shp)

}


6. Calculo de promedios de precipitación para cada mes en nuestros departamentos objeto de estudio. Se crean listas vacías donde se guardaran los datos de promedios para cada raster por departamento.


prec_mean_antioquia <- list(); prec_mean_cund <- list(); prec_mean_valle <- list()
prec_df_antioquia   <- NA; prec_df_cund <- NA; prec_df_valle <- NA

for(i in 1:length(prec_antioquia)){
  
  prec_mean_antioquia[[i]] <- mean(prec_antioquia[[i]][], na.rm = T)
  prec_df_antioquia <- t(as.data.frame((rbind(prec_mean_antioquia))))
  
  prec_mean_cund[[i]] <- mean(prec_cundinamarca[[i]][], na.rm = T)
  prec_df_cund      <- t(as.data.frame((rbind(prec_mean_cund))))
  
  prec_mean_valle[[i]]<- mean(prec_valle[[i]][], na.rm = T)
  prec_df_valle     <- t(as.data.frame((rbind(prec_mean_valle))))
  
}

7. Orden de datos para ggplot


df_prec <- data.frame(prec_df_antioquia, prec_df_cund, prec_df_valle)
df_prec <- df_prec %>%
      mutate(Month_numeric = 1:nrow(df_prec)) %>%
      mutate(prec_mean_antioquia = as.numeric(prec_mean_antioquia), 
      prec_mean_cund = as.numeric(prec_mean_cund),
      prec_mean_valle  = as.numeric(prec_mean_valle))

prec_df_rename <- rename(df_prec, Antioquia = prec_mean_antioquia, 
                 Cundinamarca = prec_mean_cund, Valle = prec_mean_valle)

prec_df_melt <- melt(prec_df_rename, id = 'Month_numeric')
prec_df_melt <- rename(prec_df_melt, Departamento = variable)

8. Creación de gráfico base

gg  <- ggplot(prec_df_melt, aes(Month_numeric, value,  fill = Departamento, colour = Departamento))+ geom_line() + xlab("Mes") + ylab("Precipitación (mm)") + ggtitle("Precipitación para cada mes") +
scale_x_continuous(expand = c(0,0), breaks = c(1:12), labels = c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")) +        theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
theme(legend.position = "bottom")


9. Creación de gráfico base


gg <- gg + scale_colour_manual(labels = c("Antioquia", "Cundinamarca", "Valle del Cauca"), values = c("red", "green", "blue"))

10. Guardado de gráfico en buena resolución


ggsave(plot = gg, paste0(path, "/_png/precYear_dptos.png"), width = 9, height = 8, units = "in")
gg


El gráfico debe quedar así:




Comentarios

Entradas populares de este blog

Extracción por mascara en R

Convertir una tabla a shape en R

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