No dia 31 de dezembro de 2016 o Posto Meteorológico da ESALQ/USP completou 100 anos de funcionamento. Em “comemoração” a este belo banco de dados, pretendo fazer alguns gráficos para analisar, sem muita pretensão, como o clima variou de lá pra cá.

No site do Posto podemos encontrar os dados nas escalas diária e mensal. Separei apenas os dados mensais para vermos aqui. Fiz algumas poucas adaptações no banco para poder pelo menos iniciar a análise. Não considerei nenhuma consistência e preenchimento de falhas (tem bastante, o que é completamente compreensível!).

Minha primeira movimentação é criar colunas para identificar o ano e as décadas, precisaremos delas mais para frente.

if (!require("pacman")) install.packages("pacman")
pacman::p_load(readr, dplyr, RcppRoll, lubridate, stringr, ggplot2, ggridges)
clima <- read_csv2("https://raw.githubusercontent.com/italocegatta/italocegatta.github.io_source/master/content/dados/posto_esalq.csv") %>% 
  mutate(
    data = dmy(data),
    ano = year(data),
    decada_label = cut(ano, breaks = seq(1910, 2020, by = 10), dig.lab = 100, right = FALSE),
    decada = as.numeric(str_extract(decada_label, "[0-9]+"))
  )

clima
## # A tibble: 1,200 x 9
##    data        prec    ur t_max t_min t_med   ano decada_label decada
##    <date>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>         <dbl>
##  1 1917-01-01 296.     NA  28.1  18.3  23.2  1917 [1910,1920)    1910
##  2 1917-02-01 136.     NA  28.3  18.4  23.3  1917 [1910,1920)    1910
##  3 1917-03-01  58.9    NA  28.6  16.9  22.7  1917 [1910,1920)    1910
##  4 1917-04-01 116.     NA  26.7  13.9  20.3  1917 [1910,1920)    1910
##  5 1917-05-01  58.5    NA  22.2   8.6  15.4  1917 [1910,1920)    1910
##  6 1917-06-01  13      NA  23.3   6.3  14.8  1917 [1910,1920)    1910
##  7 1917-07-01  13.3    NA  24     7.7  15.9  1917 [1910,1920)    1910
##  8 1917-08-01   5.4    NA  26.4   7.5  16.9  1917 [1910,1920)    1910
##  9 1917-09-01  62.2    NA  27.8  12.2  20    1917 [1910,1920)    1910
## 10 1917-10-01  58.4    NA  27.6  13.8  20.7  1917 [1910,1920)    1910
## # ... with 1,190 more rows

Vou começar pela precipitação mensal. Para visualizar a distribuição dos dados a melhor abordagem é fazer um histograma. Vamos criar um histograma com intervalo de classe de 15 mm de chuva para cada mês do ano considerando os 100 anos de dados.

clima %>% 
  mutate(mes = month(data)) %>% 
  ggplot(aes(prec, rev(factor(mes)), height = ..density..)) +
  geom_density_ridges(stat = "binline", binwidth = 15, fill = "grey20", color = "grey90") +
  labs(
    x = "Chuva mensal (mm)",
    y = "Mês"
  ) +
  scale_fill_viridis_c() +
  scale_x_continuous(breaks = seq(0,700, 30)) +
  scale_y_discrete(labels = format(ISOdate(2000, 12:1, 1), "%b")) +
  theme_bw(16) +
  theme(panel.grid.minor = element_blank())

E qual a década que mais choveu? Como variou a chuva anual ao longo desses 100 anos? Primeiro precisamos calcular quanto choveu em cada década. Em seguida vamos calcular quanto choveu em cada ano e juntar as duas informações. No gráfico abaixo, representei a média da década numa linha de tendência suavizada. Notem que a seca de 2014 Não foi a maior do século, houveram outros 4 anos mais secos desde de 1917.

prec_decada <- clima %>% 
  group_by(decada, ano) %>% 
  summarise(prec = sum(prec)) %>% 
  group_by(decada) %>% 
  summarise(prec = mean(prec)) 

clima %>% 
  group_by(decada, ano) %>% 
  summarise(prec = sum(prec)) %>% 
  ungroup() %>% 
  ggplot(aes(ano, prec)) +
    geom_line() +
    geom_point() +
    geom_smooth(
      data = prec_decada,
      aes(decada + 5, prec)
    ) +
    labs(
      x = "Ano",
      y = "Precipitação anual (mm)"
    ) +
    scale_x_continuous(breaks = seq(1917, 2017, 10)) +
    theme_bw(16)

Passando para a temperatura média, podemos construir um painel com a densidade de probabilidade para valores que variam entre 12,5 a 27,7 (amplitude dos dados).

ggplot(clima, aes(t_med)) +
  geom_density(fill = "cadetblue", alpha = 0.8) +
  facet_wrap(~ano) +
  labs(
    x = "Temperatura média mensal (°C)",
    y = "Densidade"
  ) +
  theme_bw(9)

Considerando as décadas, podemos fazer um gráfico um pouco mais simples para facilitar a visualização. Agora, cada década tem sua distribuição de probabilidade. Aparentemente, a calda da direita está se deslocando para maiores temperaturas.

ggplot(clima, aes(t_med, factor(decada), fill = ..x..)) +
  geom_density_ridges_gradient(show.legend = FALSE, color = "white") +
  labs(
    x = "Temperatura média mensal (°C)",
    y = "Década"
  ) +
  scale_fill_viridis_c() +
  theme_bw(9)

E quanto a variação da temperatura nos meses do ano? Quanto podemos esperar de frio ou calor em cada mês?

clima %>% 
  mutate(mes = month(data)) %>% 
  ggplot(aes(t_med, rev(factor(mes)),  fill = ..x..)) +
  geom_density_ridges_gradient(color = "white", show.legend = FALSE) +
  labs(
    x = "Temperatura média mensal (°C)",
    y = "Mês"
  ) +
  scale_fill_viridis_c() +
  scale_x_continuous(breaks = seq(0,40, 4)) +
  scale_y_discrete(labels = format(ISOdate(2000, 12:1, 1), "%b")) +
  theme_bw(16)

Podemos também visualizar a amplitude da temperatura máxima e mínima ao longo dos anos.

ggplot(clima, aes(month(data))) +
  geom_ribbon(aes(ymax = t_max, ymin = t_min), alpha = 0.8) +
  facet_wrap(~ano) +
  labs(
    x = "Mês",
    y = "Amplitude da temperatura mínima e máxima mensal (°C)"
  ) +
  scale_x_continuous(
    breaks = seq(1, 12, 2), 
    labels = format(ISOdate(2000, seq(1, 12, 2), 1), "%b")
  ) +
  theme_bw(10)

Para finalizar, vamos calcular a média móvel de 30 anos para a temperatura média. Sem dúvida, dos anos 90 pra cá a temperatura média só vem subindo. A minha grande dúvida é: como será que a produção de alimentos e biomassa vai se comportar com essa mudança de clima? Será um grande desafio para a nossa geração, sem dúvida.

clima_normal <- clima %>%
  filter(!is.na(t_med)) %>% 
  group_by(ano = year(data)) %>%
  summarise(t_med = mean(t_med, na.rm = TRUE)) %>% 
  ungroup() %>% 
  mutate(t_med_movel = roll_mean(t_med, 30, align = "right", fill = NA)) %>% 
  filter(!is.na(t_med_movel))

ggplot(clima_normal, aes(t_med_movel, ano)) +
  geom_path() +
  geom_point(shape = 21, color = "white", fill = "black", alpha = 0.8, size = 4) +
    labs(
    x = "Média móvel da temperatura média (°C)",
    y = "Ano"
  ) +
  scale_y_reverse(breaks = seq(1940, 2017, by = 5)) +
  theme_bw(16)

Caso tenha alguma dúvida ou sugestão sobre o post, fique à vontade para fazer um comentário ou me contatar por E-mail.

sessioninfo::session_info(c("readr", "dplyr", "ggplot2", "RcppRoll", "lubridate", "stringr", "ggridges"))
## - Session info ----------------------------------------------------------
##  setting  value                       
##  version  R version 3.5.3 (2019-03-11)
##  os       Windows 10 x64              
##  system   x86_64, mingw32             
##  ui       RTerm                       
##  language (EN)                        
##  collate  Portuguese_Brazil.1252      
##  ctype    Portuguese_Brazil.1252      
##  tz       America/Sao_Paulo           
##  date     2019-08-25                  
## 
## - Packages --------------------------------------------------------------
##  package      * version  date       lib source        
##  assertthat     0.2.1    2019-03-21 [1] CRAN (R 3.5.3)
##  backports      1.1.4    2019-04-10 [1] CRAN (R 3.5.3)
##  BH             1.69.0-1 2019-01-07 [1] CRAN (R 3.5.2)
##  cli            1.1.0    2019-03-19 [1] CRAN (R 3.5.3)
##  clipr          0.7.0    2019-07-23 [1] CRAN (R 3.5.3)
##  colorspace     1.4-1    2019-03-18 [1] CRAN (R 3.5.3)
##  crayon         1.3.4    2017-09-16 [1] CRAN (R 3.5.1)
##  digest         0.6.20   2019-07-04 [1] CRAN (R 3.5.3)
##  dplyr        * 0.8.3    2019-07-04 [1] CRAN (R 3.5.3)
##  ellipsis       0.2.0.1  2019-07-02 [1] CRAN (R 3.5.3)
##  fansi          0.4.0    2018-10-05 [1] CRAN (R 3.5.1)
##  ggplot2      * 3.2.1    2019-08-10 [1] CRAN (R 3.5.3)
##  ggridges     * 0.5.1    2018-09-27 [1] CRAN (R 3.5.2)
##  glue           1.3.1    2019-03-12 [1] CRAN (R 3.5.3)
##  gtable         0.3.0    2019-03-25 [1] CRAN (R 3.5.3)
##  hms            0.5.0    2019-07-09 [1] CRAN (R 3.5.3)
##  labeling       0.3      2014-08-23 [1] CRAN (R 3.5.0)
##  lattice        0.20-38  2018-11-04 [2] CRAN (R 3.5.3)
##  lazyeval       0.2.2    2019-03-15 [1] CRAN (R 3.5.3)
##  lubridate    * 1.7.4    2018-04-11 [1] CRAN (R 3.5.1)
##  magrittr       1.5      2014-11-22 [1] CRAN (R 3.5.1)
##  MASS           7.3-51.1 2018-11-01 [2] CRAN (R 3.5.3)
##  Matrix         1.2-17   2019-03-22 [1] CRAN (R 3.5.3)
##  mgcv           1.8-28   2019-03-21 [1] CRAN (R 3.5.3)
##  munsell        0.5.0    2018-06-12 [1] CRAN (R 3.5.1)
##  nlme           3.1-137  2018-04-07 [2] CRAN (R 3.5.3)
##  pillar         1.4.2    2019-06-29 [1] CRAN (R 3.5.3)
##  pkgconfig      2.0.2    2018-08-16 [1] CRAN (R 3.5.1)
##  plogr          0.2.0    2018-03-25 [1] CRAN (R 3.5.1)
##  plyr           1.8.4    2016-06-08 [1] CRAN (R 3.5.1)
##  purrr          0.3.2    2019-03-15 [1] CRAN (R 3.5.3)
##  R6             2.4.0    2019-02-14 [1] CRAN (R 3.5.2)
##  RColorBrewer   1.1-2    2014-12-07 [1] CRAN (R 3.5.0)
##  Rcpp           1.0.2    2019-07-25 [1] CRAN (R 3.5.3)
##  RcppRoll     * 0.3.0    2018-06-05 [1] CRAN (R 3.5.2)
##  readr        * 1.3.1    2018-12-21 [1] CRAN (R 3.5.2)
##  reshape2       1.4.3    2017-12-11 [1] CRAN (R 3.5.1)
##  rlang          0.4.0    2019-06-25 [1] CRAN (R 3.5.3)
##  scales         1.0.0    2018-08-09 [1] CRAN (R 3.5.1)
##  stringi        1.4.3    2019-03-12 [1] CRAN (R 3.5.3)
##  stringr      * 1.4.0    2019-02-10 [1] CRAN (R 3.5.2)
##  tibble         2.1.3    2019-06-06 [1] CRAN (R 3.5.3)
##  tidyselect     0.2.5    2018-10-11 [1] CRAN (R 3.5.1)
##  utf8           1.1.4    2018-05-24 [1] CRAN (R 3.5.1)
##  vctrs          0.2.0    2019-07-05 [1] CRAN (R 3.5.3)
##  viridisLite    0.3.0    2018-02-01 [1] CRAN (R 3.5.1)
##  withr          2.1.2    2018-03-15 [1] CRAN (R 3.5.1)
##  zeallot        0.1.0    2018-01-28 [1] CRAN (R 3.5.2)
## 
## [1] C:/Users/Italo/Documents/R/win-library/3.5
## [2] C:/Program Files/R/R-3.5.3/library