Contacto
Fabio Alexander Castro Llanos: fabioalexandercastro@gmail.com wa.me/+573217850490
En este pequeño proyecto desarrollé una aplicación interactiva en R Shiny para visualizar el Palmer Drought Severity Index (PDSI) a nivel municipal en Colombia. La idea es bastante simple: poder explorar cómo cambian las condiciones de sequía o humedad mes a mes usando un mapa interactivo.
El resultado final es una app donde el usuario puede seleccionar año y mes, y automáticamente el mapa se actualiza mostrando el valor del índice en cada municipio.
La aplicación está construida usando sf, leaflet, tidyverse y Shiny, junto con algunos ajustes visuales usando bslib para darle una apariencia moderna
📦 Carga de librerías y datos
El primer paso consiste en cargar las librerías necesarias y leer los datos que vamos a usar.
En este caso se utilizan dos datasets principales:
- Un shapefile simplificado de los municipios de Colombia
- Una tabla con los valores mensuales del PDSI
require(sf)require(tidyverse)require(shiny)require(leaflet)require(bslib)require(RColorBrewer)mpio <- st_read("./www/mpios_simplify.gpkg", quiet = TRUE)znal <- read_csv( "./www/zonal_pdsi_year-monthly_gather.csv") |> select(MpCodigo, MpNombre, Depto, year, month, value)
Algo importante aquí es asegurarse de que el código del municipio tenga el mismo tipo de dato en ambas tablas para poder hacer correctamente el join.
mpio$MPIO_CCNCT <- as.character(mpio$MPIO_CCNCT)znal$MpCodigo <- as.character(znal$MpCodigo)
🎛️ Interfaz de usuario (UI)
La interfaz se construyó con Bootstrap 5 usando el paquete bslib. Esto permite aplicar temas modernos y tipografías personalizadas.
theme = bs_theme( version = 5, bootswatch = "darkly", primary = "#38bdf8")
En el panel izquierdo se agregaron dos controles simples:
- selección de año
- selección de mes
selectInput("yr", "Año", choices = yrs_avl)selectInput("mt", "Mes", choices = mth_avl)
Estos inputs serán los que controlan la actualización del mapa.
En el panel principal se incluye el mapa interactivo:
leafletOutput("map_pdsi")
Además agregué algunos detalles visuales como tarjetas (cards), tipografía moderna y enlaces a redes sociales.
⚡ Lógica reactiva en el servidor
La magia de Shiny ocurre en el server, donde se construye el flujo reactivo de la aplicación.
Primero se filtran los datos del índice según el año y el mes seleccionados:
tbl_pdsi <- reactive({ znal |> filter( year == input$yr, month == input$mt )})
Luego se realiza la unión con el shapefile municipal:
mpio_pdsi <- reactive({ mpio |> left_join( tbl_pdsi(), by = c("MPIO_CCNCT" = "MpCodigo") )})
De esta forma cada municipio queda asociado con su valor del índice PDSI.
🗺️ Construcción del mapa interactivo
Primero se inicializa el mapa base usando Leaflet:
output$map_pdsi <- renderLeaflet({ leaflet() %>% addProviderTiles(providers$CartoDB.Positron) %>% setView(lng = -74, lat = 4.5, zoom = 6)})
Después se actualizan los polígonos dinámicamente cada vez que cambia el año o el mes.
pal <- colorNumeric( palette = brewer.pal(11, "BrBG"), domain = dat$value)
Esta paleta permite representar:
- valores negativos → sequía
- valores positivos → humedad
Finalmente se dibujan los municipios en el mapa.
addPolygons( fillColor = ~pal(value), fillOpacity = 0.8, label = ~paste0(MpNombre, "<br>PDSI: ", round(value,2)))
Además se agrega una leyenda dinámica que ayuda a interpretar los colores.
🌎 Resultado
El resultado es una pequeña aplicación interactiva que permite explorar rápidamente las condiciones de sequía o humedad en Colombia a escala municipal.
Este tipo de herramientas resulta especialmente útil para:
- monitoreo climático
- análisis agroclimático
- exploración de datos espaciales en tiempo real
Y demuestra lo poderoso que puede ser R para construir aplicaciones geoespaciales interactivas con relativamente pocas líneas de código.
Deja un comentario