# Pacotes ----------------------------------------------------------------
library(sf)
library(dplyr)
library(ggplot2)
library(patchwork)
library(readxl)
# Diretório de trabalho ---------------------------------------------------
setwd("C:/Users/ricar/OneDrive/Documentos/Projetos/Observatorio_Equidade/BR_Municipios_2025")
# Leitura dos dados -------------------------------------------------------
dados_tab <- read_excel("dados_climaticos2.xlsx")
shape_mun <- st_read("BR_Municipios_2025.shp", quiet = TRUE) |>
st_transform(4326) |>
st_make_valid() |>
st_simplify(dTolerance = 0.01, preserveTopology = TRUE)
# Junção tabela + shape ---------------------------------------------------
dados_sf <- shape_mun |>
left_join(dados_tab, by = c("NM_MUN", "NM_UF"))
# Ordem das classes SPI ---------------------------------------------------
ordem_classes <- c(
"Extrema. seco",
"Sev. seco",
"Mod. seco",
"Seca incip.",
"Normal",
"Umid. incip.",
"Mod. úmido",
"Sev. úmido",
"Extrema. úmido"
)
dados_sf$classe_spi <- factor(
dados_sf$classe_spi,
levels = ordem_classes
)
# Função para gerar mapas por ano ----------------------------------------
mapa_classe_spi_ano <- function(ano) {
df_ano <- dados_sf |>
filter(YEAR == ano)
plots <- lapply(
sort(unique(df_ano$trimestre)),
function(t) {
ggplot(df_ano |> filter(trimestre == t)) +
geom_sf(aes(fill = classe_spi), color = NA) +
scale_fill_brewer(
palette = "Spectral",
drop = FALSE
) +
labs(
title = paste("Classes de SPI –", t, "/", ano),
fill = "Classe SPI"
) +
theme_minimal() +
theme(
legend.position = "bottom",
legend.title = element_text(size = 9),
legend.text = element_text(size = 8),
plot.title = element_text(size = 11, face = "bold")
)
}
)
wrap_plots(
plots,
ncol = 2,
guides = "collect"
) &
theme(
legend.position = "bottom"
)
}
# Geração dos mapas -------------------------------------------------------
anos <- sort(unique(dados_sf$YEAR))
lapply(anos, mapa_classe_spi_ano)
## [[1]]

##
## [[2]]

##
## [[3]]

##
## [[4]]

##
## [[5]]

##
## [[6]]
