Criando um gráfico animado em R
Neste artigo, vou mostrar como criar uma visualização animada em R com GGPLOT2 e o GGAnimate, dos preços médios de venda da gasolina por região, utilizando os dados históricos disponíveis no portal dados.gov.br. A animação permite explorar a evolução dos preços ao longo de diferentes anos e regiões.
Os dados e o código estão, também, disponíveis em: https://www.dropbox.com/scl/fo/e11w5dunn8bvy3kkz8thi/AKeAz6rLCeLgCHp10Qtpv0Q?rlkey=hd8l0dik230iqcw5blad0yuhn&st=1xaen9rq&dl=0
Abaixo apresento o gráfico gerado neste material.
Passo 1: Obtenção e Padronização dos Dados
No portal dados.gov.br, acessamos a série histórica de preços de combustíveis e GLP, que fornece informações detalhadas em arquivos CSV. Para este exemplo, utilizamos os arquivos correspondentes aos períodos:
- 2022.2
- 2023.1
- 2023.2
- 2024.1
Renomeamos os arquivos para um padrão mais simples: 2022.2.csv
, 2023.1.csv
, 2023.2.csv
, e 2024.1.csv
.
Passo 2: Carregamento e Pré-processamento dos Dados
A primeira etapa no código é carregar os arquivos CSV e transformar os dados brutos em um formato adequado para análise. O script usa as seguintes bibliotecas:
ggplot2
: para criar gráficos.gganimate
: para animações.gifski
: para salvar as animações como GIF.transformr
: para suavizar transições.tidyr
,dplyr
, elubridate
: para manipulação de dados.
Caso esteja no Ubuntu, pode ser necessário adicionar alguns pacotes:
install.packages(c(“ggplot2”, “gganimate”, “gifski”, “transformr”, “tidyr”, “dplyr”, “readr”, “lubridate”))
A função preparar_dados()
foi criada para processar cada arquivo:
- Renomear colunas: Substituímos espaços nos nomes das colunas por
_
para evitar problemas. - Filtrar dados relevantes: Selecionamos apenas registros de gasolina (com ou sem aditivos) e preços em “R$ / litro”.
- Criar colunas auxiliares:
Ano
: extraído da data de coleta.Trimestre
: categorizado com base no mês da coleta.
Código da Função:
preparar_dados <- function(arquivo) {
dados <- read_delim(arquivo, delim = ";", col_names = TRUE, show_col_types = FALSE) %>%
rename_with(~ gsub(" ", "_", .), everything()) %>%
filter(Produto %in% c("GASOLINA", "GASOLINA_ADITIVADA") & Unidade_de_Medida == "R$ / litro") %>%
mutate(
Ano = year(dmy(Data_da_Coleta)),
Trimestre = case_when(
month(dmy(Data_da_Coleta)) %in% 1:3 ~ "1º Trimestre",
month(dmy(Data_da_Coleta)) %in% 4:6 ~ "2º Trimestre",
month(dmy(Data_da_Coleta)) %in% 7:9 ~ "3º Trimestre",
month(dmy(Data_da_Coleta)) %in% 10:12 ~ "4º Trimestre"
),
Valor_de_Venda = as.numeric(Valor_de_Venda)
) %>%
select(Regiao_Sigla = `Regiao_-_Sigla`, Ano, Trimestre, Valor_de_Venda)
return(dados)
}
Os dados de todos os arquivos foram carregados e combinados com:
dados_combinados <- arquivos %>%
lapply(preparar_dados) %>%
bind_rows()
Passo 3: Cálculo das Médias
Agrupamos os dados por região e ano para calcular a média dos preços de venda:
media_por_regiao <- dados_combinados %>%
group_by(Regiao_Sigla, Ano) %>%
summarize(Media_Valor = mean(Valor_de_Venda, na.rm = TRUE)) %>%
ungroup()
Passo 4: Criação do Gráfico
Com os dados prontos, criamos um gráfico de dispersão animado. Cada ponto representa uma região, com:
- Eixo X: anos.
- Eixo Y: preço médio.
- Cores: diferentes regiões.
Código do Gráfico:
grafico <- ggplot(media_por_regiao, aes(x = Ano, y = Media_Valor, color = Regiao_Sigla)) +
geom_point(size = 5, alpha = 0.8) +
labs(
title = "Evolução da Média do Preço de Venda da Gasolina por Região",
subtitle = "Ano: {frame_time}",
x = "Ano",
y = "Preço Médio (R$ / litro)",
color = "Região"
) +
theme_minimal() +
theme(legend.position = "bottom") +
scale_x_continuous(breaks = unique(media_por_regiao$Ano)) +
transition_time(Ano) +
ease_aes('linear')
Passo 5: Salvando a Animação
A animação foi gerada com o pacote gganimate
e salva como GIF:
animacao <- animate(
grafico,
nframes = 100,
fps = 10,
width = 800,
height = 600,
renderer = gifski_renderer()
)
anim_save("grafico_animado_gasolina_bolinhas.gif", animation = animacao)
Conclusão
O resultado final é uma animação mostrando a evolução do preço médio da gasolina por região ao longo dos anos, destacando variações regionais e temporais. O gráfico animado permite uma análise visual clara e intuitiva das tendências de preços.
Você pode explorar os dados completos acessando o portal dados.gov.br. Experimente adaptar o código para outros combustíveis ou períodos!
Código completo:
library(ggplot2)
library(gganimate)
library(gifski)
library(transformr)
library(tidyr)
library(dplyr)
library(readr)
library(lubridate)
arquivos <- c("2022.2.csv", "2023.1.csv", "2023.2.csv", "2024.1.csv")
# Função para carregar e preparar os dados
preparar_dados <- function(arquivo) {
dados <- read_delim(arquivo, delim = ";", col_names = TRUE, show_col_types = FALSE) %>%
rename_with(~ gsub(" ", "_", .), everything()) %>%
filter(Produto %in% c("GASOLINA", "GASOLINA_ADITIVADA") & Unidade_de_Medida == "R$ / litro") %>%
mutate(
Ano = year(dmy(Data_da_Coleta)),
Trimestre = case_when(
month(dmy(Data_da_Coleta)) %in% 1:3 ~ "1º Trimestre",
month(dmy(Data_da_Coleta)) %in% 4:6 ~ "2º Trimestre",
month(dmy(Data_da_Coleta)) %in% 7:9 ~ "3º Trimestre",
month(dmy(Data_da_Coleta)) %in% 10:12 ~ "4º Trimestre"
),
Valor_de_Venda = as.numeric(Valor_de_Venda)
) %>%
select(Regiao_Sigla = `Regiao_-_Sigla`, Ano, Trimestre, Valor_de_Venda)
return(dados)
}
# Carregar e combinar os dados
dados_combinados <- arquivos %>%
lapply(preparar_dados) %>%
bind_rows()
# Calcular a média de preço por região e ano
media_por_regiao <- dados_combinados %>%
group_by(Regiao_Sigla, Ano) %>%
summarize(Media_Valor = mean(Valor_de_Venda, na.rm = TRUE)) %>%
ungroup()
# Criar o gráfico animado
grafico <- ggplot(media_por_regiao, aes(x = Ano, y = Media_Valor, color = Regiao_Sigla)) +
geom_point(size = 5, alpha = 0.8) +
labs(
title = "Evolução da Média do Preço de Venda da Gasolina por Região",
subtitle = "Ano: {frame_time}",
x = "Ano",
y = "Preço Médio (R$ / litro)",
color = "Região"
) +
theme_minimal() +
theme(legend.position = "bottom") +
scale_x_continuous(breaks = unique(media_por_regiao$Ano)) +
transition_time(Ano) +
ease_aes('linear')
# Salvar a animação
animacao <- animate(
grafico,
nframes = 100,
fps = 10,
width = 800,
height = 600,
renderer = gifski_renderer()
)
anim_save("grafico_animado_gasolina_bolinhas.gif", animation = animacao)
Publicar comentário