# ---------------------------------------------------------
# Pacotes
# ---------------------------------------------------------
library(sf)
library(dplyr)
library(ggplot2)
library(patchwork)
library(readxl)
library(cowplot)
# ---------------------------------------------------------
# DiretĂłrio
# ---------------------------------------------------------
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
# ---------------------------------------------------------
dados_sf <- shape_mun %>%
left_join(dados_tab, by = c("NM_MUN", "NM_UF"))
# ---------------------------------------------------------
# Classes SPI (ordem fixa)
# ---------------------------------------------------------
ordem_classes <- c(
"Extremamente seco",
"Severamente seco",
"Moderadamente seco",
"Seca incipiente",
"Umidade incipiente",
"Moderadamente Ăşmido",
"Severamente Ăşmido",
"Extremamente Ăşmido")
dados_sf$`Classes de SPI` <- factor(dados_sf$`Classes de SPI`, levels = ordem_classes)
# ---------------------------------------------------------
# Função FINAL correta
# ---------------------------------------------------------
mapa_classe_spi_ano <- function(ano) {
df_ano <- dados_sf %>%
filter(YEAR == ano)
# ------------------------
# Mapas por trimestre (SEM legenda)
# ------------------------
plots <- lapply(
sort(unique(df_ano$trimestre)),
function(t) {
ggplot(df_ano %>% filter(trimestre == t)) +
geom_sf(aes(fill = `Classes de SPI`), color = NA) +
scale_fill_brewer(
palette = "Spectral",
drop = FALSE,
limits = ordem_classes
) +
labs(title = paste("Classes de SPI –", t, "/", ano)) +
theme_minimal() +
theme(
legend.position = "none",
plot.title = element_text(size = 11, face = "bold")
)
}
)
# ------------------------
# Legenda Ăşnica (correta)
# ------------------------
legenda_plot <- ggplot(dados_sf) +
geom_sf(aes(fill = `Classes de SPI`)) +
scale_fill_brewer(
palette = "Spectral",
drop = FALSE,
limits = ordem_classes
) +
theme_void() +
theme(
legend.position = "right",
legend.title = element_text(size = 10),
legend.text = element_text(size = 8)
)
legenda <- cowplot::get_legend(legenda_plot)
# ------------------------
# Combinação final
# ------------------------
mapas <- patchwork::wrap_plots(plots, ncol = 2)
final <- cowplot::plot_grid(
mapas,
legenda,
ncol = 2,
rel_widths = c(4, 1)
)
return(final)
}
# ---------------------------------------------------
# Gerar TODOS os anos (IMPORTANTE no RMarkdown)
# ---------------------------------------------------
anos <- sort(unique(dados_sf$YEAR))
for (ano in anos) {
print(mapa_classe_spi_ano(ano))
}





