Criando um gráfico animado em R

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.
grafico_animado_gasolina_bolinhas Criando um gráfico animado em R

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, e lubridate: 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

You May Have Missed