# =================================================================
# 1. CARREGAMENTO E CONFIGURAÇÕES
# =================================================================
library(tidyverse)
## Warning: pacote 'tidyverse' foi compilado no R versão 4.4.3
## Warning: pacote 'ggplot2' foi compilado no R versão 4.4.3
## Warning: pacote 'tidyr' foi compilado no R versão 4.4.1
## Warning: pacote 'purrr' foi compilado no R versão 4.4.1
## Warning: pacote 'dplyr' foi compilado no R versão 4.4.1
## Warning: pacote 'stringr' foi compilado no R versão 4.4.1
## Warning: pacote 'forcats' foi compilado no R versão 4.4.1
## Warning: pacote 'lubridate' foi compilado no R versão 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 4.0.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)
library(viridis)
## Warning: pacote 'viridis' foi compilado no R versão 4.4.3
## Carregando pacotes exigidos: viridisLite
## Warning: pacote 'viridisLite' foi compilado no R versão 4.4.1
library(Cairo)
## Warning: pacote 'Cairo' foi compilado no R versão 4.4.3
# --- Importação ---
dados <- read_delim("C:/Users/Jefferson B. Bezerra/Downloads/ETo/dez.csv",
delim = ";", escape_double = FALSE, trim_ws = TRUE)
## Rows: 930 Columns: 7
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (1): data
## dbl (6): Tmax, Tmin, UR, n, U2, Eto
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
dados <- dados %>% mutate(data = dmy(data), ano = year(data))
# =================================================================
# 2. FUNÇÃO DE AGRUPAMENTO - Mês Fixo 30 Dias
# =================================================================
agrupar_eto_fixo <- function(df, tamanho_janela) {
df %>%
group_by(ano) %>%
mutate(dia_mes = day(data)) %>%
filter(dia_mes <= 30) %>%
mutate(grupo = ceiling(dia_mes / tamanho_janela)) %>%
group_by(ano, grupo) %>%
summarise(ETo_sum = sum(Eto, na.rm = TRUE), .groups = "drop")
}
nomes_fixos <- c("30 Dias", "15 Dias", "10 Dias", "6 Dias", "5 Dias", "3 Dias")
df_lista <- list(
"30 Dias" = agrupar_eto_fixo(dados, 30),
"15 Dias" = agrupar_eto_fixo(dados, 15),
"10 Dias" = agrupar_eto_fixo(dados, 10),
"6 Dias" = agrupar_eto_fixo(dados, 6),
"5 Dias" = agrupar_eto_fixo(dados, 5),
"3 Dias" = agrupar_eto_fixo(dados, 3)
)
df_bruto_total <- bind_rows(df_lista, .id = "Escala")
df_bruto_total$Escala <- factor(df_bruto_total$Escala, levels = nomes_fixos)
# =================================================================
# 3. CÁLCULOS E ESTATÍSTICAS (DISTRIBUIÇÃO NORMAL)
# =================================================================
calc_estatisticas_normal <- function(df_escala, nome) {
vetor <- df_escala$ETo_sum
# Estimativa dos parâmetros da Normal
media <- mean(vetor, na.rm = TRUE)
desvio <- sd(vetor, na.rm = TRUE)
# Teste KS para a Normal (pnorm)
ks <- ks.test(vetor, "pnorm", mean = media, sd = desvio)
txt <- sprintf("μ: %.2f\nσ: %.2f\nD: %.3f\np: %.3f",
media, desvio, ks$statistic, ks$p.value)
return(data.frame(Escala = nome, Media = media, Desvio = desvio, Rotulo = txt))
}
resumo_estatistico <- map2_df(df_lista, names(df_lista), calc_estatisticas_normal)
## Warning in ks.test.default(vetor, "pnorm", mean = media, sd = desvio): não
## devem existir empates no teste de Kolmogorov-Smirnov de apenas uma amostra
## Warning in ks.test.default(vetor, "pnorm", mean = media, sd = desvio): não
## devem existir empates no teste de Kolmogorov-Smirnov de apenas uma amostra
## Warning in ks.test.default(vetor, "pnorm", mean = media, sd = desvio): não
## devem existir empates no teste de Kolmogorov-Smirnov de apenas uma amostra
## Warning in ks.test.default(vetor, "pnorm", mean = media, sd = desvio): não
## devem existir empates no teste de Kolmogorov-Smirnov de apenas uma amostra
resumo_estatistico$Escala <- factor(resumo_estatistico$Escala, levels = nomes_fixos)
# Curvas teóricas da Normal
df_curvas <- resumo_estatistico %>%
group_by(Escala) %>%
do({
vetor_ref <- df_lista[[.$Escala]]$ETo_sum
# Criar sequência ao redor da média para cobrir a curva de sino
x_seq <- seq(min(vetor_ref) * 0.8, max(vetor_ref) * 1.2, length.out = 300)
data.frame(x = x_seq, densidade = dnorm(x_seq, mean = .$Media, sd = .$Desvio))
}) %>%
ungroup()
# =================================================================
# 4. GRÁFICO FINAL (HISTOGRAMA + NORMAL + ESTATÍSTICAS)
# =================================================================
grafico_normal <- ggplot() +
geom_histogram(data = df_bruto_total, aes(x = ETo_sum, y = after_stat(density), fill = Escala),
bins = 15, color = "white", alpha = 0.5) +
geom_line(data = df_curvas, aes(x = x, y = densidade), color = "black", linewidth = 0.8) +
geom_text(data = resumo_estatistico, aes(label = Rotulo),
x = Inf, y = Inf, hjust = 1.1, vjust = 1.2,
size = 3.5, family = "mono", fontface = "bold") +
facet_wrap(~Escala, scales = "free", ncol = 2) +
scale_fill_viridis_d(option = "mako") + # Mudança de cor para diferenciar da Gama
labs(
title = "Ajuste da Distribuição Normal (Mês Padronizado: 30 dias)",
subtitle = "Escalas Temporais com Intervalos Homogêneos",
x = "Evapotranspiração de Referência (mm)",
y = "Densidade"
) +
theme_bw(base_size = 11) +
theme(
legend.position = "none",
strip.background = element_rect(fill = "darkblue", color = "black"),
strip.text = element_text(face = "bold", size = 10, color = "white"),
panel.grid.minor = element_blank(),
plot.title = element_text(face = "bold", hjust = 0.5, size = 14)
)
# =================================================================
# 5. EXPORTAÇÃO
# =================================================================
ggsave("ETo_Normal_30dias_dez.png", plot = grafico_normal, type = "cairo",
width = 20, height = 24, units = "cm", dpi = 600)
## Warning: Using ragg device as default. Ignoring `type` and `antialias`
## arguments
print(grafico_normal)
