#Carregando os pacotes
library(tidyverse) #para lidar com os dados (ggplot tá aí!)
library(lubridate) #para lidar com as datas
library(weathermetrics) #para converter a temperatura
library(janitor) #clean_names
library(ggtext) # para suportar texto com HTML
library(glue) # para criar strings
Sys.setlocale("LC_TIME", "pt_BR.UTF-8")
## [1] "pt_BR.UTF-8"
Estive nos EUA durante quatro meses em 2022, entre setembro e dezembro, do final do verão até o começo do inverno. Precisei lidar com o calor texano de 30°C (e muito suor, pressão baixa e protetor solar) e temperaturas negativas no inverno de Nova York (e o hábito de entrar em cafés quentinhos apenas pra reter o calor do meu corpo por uns minutos). Perrengues chiques estadunidenses.
Eu não gosto das altas temperaturas. Até canto ai que delícia o verão, a gente mostra o ombrinho etc mas minha ligação com o calor acaba aí. Eu tenho pressão baixa, então a maior parte do tempo me preocupava em não passar mal (o que aconteceu algumas vezes no TX). Por outro lado, eu não tinha ideia do que era viver temperaturas tão baixas a ponto de travar meu celular ou de ver lagos congelados. Quando chegou o inverno, não tinha roupas pra um friozão porque acreditava que meu moletom universitário era suficiente hehe estava BEM enganada. Lá vai eu comprar um casacão nos outlets.
Pensando nessas nuances, fiz um gráfico que mostra as temperaturas diárias que encarei enquanto estive nos EUA. Achei que seria bacana treinar minha fluência no tidyverse e conhecer outros pacotes do R revisitando umas informações do meu período de intercâmbio.
Mãos à obra
Setup inicial
Os dados eu peguei pra uma tarefa da disciplina Reporting With Data. Exportei do site os registros das estações de Austin e de Nova York, no período entre setembro e dezembro de 2022. Alguns desafios:
Selecionar o período específico em que eu estive em cada cidade;
Como a temperatura estava em Fahrenheit, tive que converter para Celsius (afinal, aqui é BR). Usei o pacote
weathermetrics
pra essa tarefaAcrescentar dados de São Paulo (onde estive na primeira semana de setembro);
Formatar datas.
#Carregando os dados
<- read.csv("data/3643365.csv") |>
df clean_names()
#Formatando as datas
$date <- as.Date(df$date, format = "%Y-%m-%d")
df
# Filtrando os dados de acordo com as condições de data e estação metereológica
<- df %>%
filtered_df filter((station == "USW00013958" & date >= as.Date("2022-09-01") & date <= as.Date("2022-12-22")) |
== "USW00014732" & date >= as.Date("2022-12-23")))
(station
# converte os dados de fahrenheit para celsius
$tmin <- fahrenheit.to.celsius(filtered_df$tmin)
filtered_df$tmax <- fahrenheit.to.celsius(filtered_df$tmax) filtered_df
Agora tenho um dataframe com registros das temperaturas de Austin e Nova York. Porém, eu fiquei um tempinho de setembro em SP. Achava errado não incluir essa informação, então adicionei as temperaturas entre 1 e 6 de setembro:
# Substituição de dados do começo de setembro pela temperatura registrada em SP
<- data.frame(
sp_data name = c("SAO PAULO", "SAO PAULO", "SAO PAULO", "SAO PAULO", "SAO PAULO", "SAO PAULO"),
date = c("2022-09-01", "2022-09-02", "2022-09-03", "2022-09-04", "2022-09-05", "2022-09-06"),
tmin = c(10.3, 12.5, 15.5, 10, 11.3, 13.7),
tmax = c(26.9, 30.2, 23.7, 15.1, 19.3, 23.9)
)
# Converter strings de data para tipo Date, se ainda não estiverem
$date <- as.Date(sp_data$date, format = "%Y-%m-%d")
sp_data
# Substituição dos valores de temperatura
<- filtered_df %>%
filtered_df mutate(
name = ifelse(date %in% sp_data$date, sp_data$name[match(date, sp_data$date)], name),
tmin = ifelse(date %in% sp_data$date, sp_data$tmin[match(date, sp_data$date)], tmin),
tmax = ifelse(date %in% sp_data$date, sp_data$tmax[match(date, sp_data$date)], tmax)
)
<-filtered_df |> select(name, date, tmin, tmax) filtered_df
Plotando o gráfico
O processo de criar o gráfico foi ok; sabia que precisava fazer um “lollipop”. Mas não contava com o transtorno que é criar anotações e posicioná-las corretamente. Foi bem “tentativa e erro” essa parte, mas gostei do resultado.
Primeiro, eu calculei os dias com maiores e menores valores para temperatura e amplitude térmica:
<- filtered_df %>% filter(tmin == min(tmin))
dia_com_menor_temperatura <- filtered_df %>% filter(tmax == max(tmax))
dia_com_maior_temperatura <- filtered_df %>% mutate(amplitude = tmax - tmin) %>% filter(amplitude == max(amplitude))
dia_com_maior_amplitude <- filtered_df %>% mutate(amplitude = tmax - tmin) %>% filter(amplitude == min(amplitude)) dia_com_menor_amplitude
Também estilizei o título. Vi numa edição da newsletter do Albert Rapp esse jeito de colocar o título e achei uma boa sacada, porque posso retirar a legenda.
# Use o ggtext para o subtitle que requer HTML
<- glue(
my_title "Temperaturas <b><span style = 'color:blue;'>mínimas</span></b> e <b><span style = 'color:orange;'>máximas</span></b> durante meu período nos EUA"
)
O resultado! Admito que não ficou TÃO do jeito que eu queria, mas gostei de fazer um gráfico inteirinho no R, sem precisar de algum software de design (viva o software livre).
<- ""
ig_icon <- glue("Fontes: National Centers for Environmental Information; Climatempo. <br>Gráfico por Bianca Muniz (<span style='font-family:\"Font Awesome 6 Brands\";'>{ig_icon};</span> biancmuniz)")
my_caption
# Cria o gráfico
<- ggplot(
figura aes(x = date)) +
filtered_df, geom_segment(aes(x = date, xend = date, y = tmin, yend = tmax)) +
geom_point(aes(y = tmin), color = "blue", size = 1) +
geom_point(aes(y = tmax), color = "orange", size = 1) +
geom_hline(yintercept = 0, linetype = "solid", color = "black", size = 0.5) + # Linha na temperatura zero
geom_segment(
aes(x = as.Date("2022-09-07"),
y = 20,
xend = as.Date("2022-09-07"),
yend = -8),
arrow = arrow(type = "closed", length = unit(0.1, "cm")), color = "red") +
annotate(
"text",
x = as.Date("2022-09-07"),
y = -12,
label = "Chegada em \nAustin: 7/set",
size = 3,
color = "black",
family="Raleway") +
theme_minimal() +
labs(title = my_title,
subtitle = "Registro das temperaturas nas cidades onde estive nos meses de setembro a dezembro de 2022",
x = "Dia",
y = "Temperatura (°C)",
caption = my_caption) +
scale_x_date(date_breaks = "1 month", date_labels = "%b") +
scale_y_continuous(breaks = seq(from = floor(min(filtered_df$tmin) / 10) * 10, to = ceiling(max(filtered_df$tmax) / 10) * 10, by = 10)) +
geom_vline(data = data.frame(date = seq(min(filtered_df$date), max(filtered_df$date), by = "1 month")),
aes(xintercept = date), linetype = "dotted", color = "gray") +
theme(plot.title = element_markdown(size = 12, family = "Bitter", face = "bold"),
axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = -1, size = 10),
plot.subtitle = element_text(family = "Bitter", size = 10),
axis.title = element_text(family = "Bitter"),
panel.grid.minor = element_blank(),
axis.text.y = element_text(size = 10),
plot.caption = element_markdown(family = "Bitter")) +
## Adicionando setas
geom_curve(
aes(
x = dia_com_menor_temperatura$date -10,
y = min(filtered_df$tmin),
xend = dia_com_menor_temperatura$date,
yend = min(filtered_df$tmin) - 2),
arrow = arrow(length = unit(0.1, "cm")), color = "red") +
geom_curve(
aes(
x = dia_com_maior_temperatura$date,
y = max(filtered_df$tmax) -5,
xend = dia_com_maior_temperatura$date,
yend = max(filtered_df$tmax) + 5),
arrow = arrow(length = unit(0.1, "cm")), color = "red") +
geom_curve(
aes(
x = dia_com_maior_amplitude$date,
y = (max(filtered_df$tmax) + min(filtered_df$tmin)) / 2,
xend = dia_com_maior_amplitude$date,
yend = max(filtered_df$tmax) + 4),
arrow = arrow(length = unit(0.1, "cm")), color = "red") +
geom_curve(aes(x = as.Date("2022-09-07"), y = 10, xend = as.Date("2022-10-16"), yend = 10),
curvature = 0, color = "red") + # Colchete
annotate("text", x = as.Date("2022-09-25"), y = 5, label = "40 dias seguidos com \ntemperaturas acima de 30°C",
size = 3, color = "black", family = "Raleway") +
## Adicionando anotações
annotate(
"text",
x = dia_com_menor_temperatura$date - 30,
y = min(filtered_df$tmin) - 4,
label = "Menor temperatura \nem todo o período:\n-13°C em NYC",
hjust = 0,
vjust = 0,
size = 3,
color = "black", family = "Raleway") +
annotate(
"text",
x = dia_com_maior_temperatura$date,
y = max(filtered_df$tmax) - 2,
label = "O dia mais quente: \n22/09, 37°C",
hjust = 1,
vjust = -0.75,
size = 3,
color = "black", family = "Raleway") +
annotate(
"text",
x = dia_com_maior_amplitude$date-10,
y = max(filtered_df$tmax) + 10,
label = "No dia 22/12, último dia que estive no Texas \nantes de ir para NY, encarei uma diferença \nde 23°C entre a temperatura mínima e a máxima",
hjust = 0.5,
vjust = 1,
size = 2.8,
color = "black", position = position_dodge(width = 0.2), family = "Raleway")
figura