Trabalho de Métodos Computacionais

Author

Matheus Jun Onishi da Silva

1 Introdução ao gganimate

O pacote gganimate tem como finalidade introduzir novas funções “camadas” que adicionam novos artifícios aos objetos gráficos implementados através do pacote ggplot2. Tais funções possuem o foco em estender a gramática dos gráficos para incluir a descrição da animação e personalizar como ele deve mudar com o tempo.

2 Instalação do pacote

É possível a instalação do gganimate através do CRAN ou pelo comando install.packages('gganimate').

# Instalação do pacote gganimate
install.packages("gganimate")

Dependendo do sistema operacional do computador ( Linux ou versã antiga do Windows) será necessário o uso de outro dois pacotes:

  • png pacote utilizado para compilar um conjunto de imagens/arquivos do tipo .png .

  • gifski pacote utilizado para a geração de imagens gif , seja através de um vídeo ou conjunto de imagem.

Obs : Talvez seja necessário reiniciar o RStudio após a instalação desses pacotes para o funcionamento completo das funções do gganimate.

# Instalação do pacote gifski
install.packages("gifski")

# Instalação do pacote png
install.packages("png")

3 Funções do gganimate:

  • As funções transition_ são usada para declarar como os os dados do gáfico devem ser interpretados em termos da camada de animação.

  • As funções view_ definem como os intervalos do sistema de coordenadas mudam durante a animação.

  • As funções shadow_ definem como os dados vindos de outras variáveis no tempo deverão ser apresentados dado o mesmo momento do tempo.

  • enter_/exit_ definem como o novo dado deverá aparecer e como o dado apresentado deverá sumir durante o curso da animação . (Definem como deverá ser a transição dos dados durante a animação).

4 Algumas aplicações :

Como dito anteriormente , o pacote gganimateadiciona novas camadas a seram implementas nos objetos criados através do ggplot2 . Logo, para começar a utiliza-lo é necessário criação de um gráfico base ao qual será adicionado essas camadas.

Utilizando o pacote gapminder , teremos a base de dados que será utilizada para os gráficos.

Esse pacote apresenta a taxa de expectativa de vida e PIB per capito de alguns países em seus respectivos continentes .

# Base de dados utilizada no arquivo.
library(gapminder)
base  = gapminder

# Mostrando a base de dados
base
# A tibble: 1,704 × 6
   country     continent  year lifeExp      pop gdpPercap
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
 1 Afghanistan Asia       1952    28.8  8425333      779.
 2 Afghanistan Asia       1957    30.3  9240934      821.
 3 Afghanistan Asia       1962    32.0 10267083      853.
 4 Afghanistan Asia       1967    34.0 11537966      836.
 5 Afghanistan Asia       1972    36.1 13079460      740.
 6 Afghanistan Asia       1977    38.4 14880372      786.
 7 Afghanistan Asia       1982    39.9 12881816      978.
 8 Afghanistan Asia       1987    40.8 13867957      852.
 9 Afghanistan Asia       1992    41.7 16317921      649.
10 Afghanistan Asia       1997    41.8 22227415      635.
# ℹ 1,694 more rows

A principal função do pacote gganimate são as funções transitions_(). Existem diversos tipos delas que são utilizadas para algum tipo específico de gráfico.

Vamos começar produzindo um gráfico de linhas relacionando o PIB per capita médio dos continentes com o ano observado.

# Pacotes necessários
library(ggplot2)
library(dplyr)

# Gráfico 1 : sem nenhuma animação
graf1 = base |> 
  group_by(continent,year) |> 
  summarise(PIBperc = median(gdpPercap)) |> 
  ggplot(mapping = aes(x = year,
                       y = PIBperc,
                       group = continent,
                       color = continent))  +
  geom_line() +
  scale_color_viridis_d() +
  geom_point() +
  labs(x = "Ano" ,
       y = "PIB per capito",
       color = "Continente")
graf1

Agora ao adicionarmos a função transition_reveal() podemos animar o gráfico de acordo com a variável ano.

library(gganimate)

# Grafico 1 : Animado
graf1 = graf1 +
    transition_reveal(year)

graf1

Agora querendo relacionar as variáveis Expectativa de Vida média e o PIB per capito médio apresentado nos continentes , podemos obter um gráfico de disperção junto com a sua linha de regressão linear . Nesse gráfico temos duas funções interessantes transition_layers() e transition_states().

# Grafico 2 : Não animado
graf2 = base |> 
  group_by(continent, year) |> 
  summarise(mediaExp = mean(lifeExp),
            mediaPIB = mean(gdpPercap)) |> 
  ggplot(mapping = aes(x = mediaPIB,
                       y = mediaExp)) +
  geom_point() +
  geom_smooth(method = "lm",
              color = "red") +
  labs(x = "PIB per capito ",
       y = "Expectativa de vida")

graf2

Utilizando a função transition_layers() contrói o gráfico camda por camada . Para tal função será necessário ativar o pacote transformr .

# Pacote necessário
library(transformr)

# Grafico 2 : Animado
graf2 +
  transition_layers()

Caso seja preciso alteração no tempo ou ordem das aparições , podemos adicionar alguns argumentos

# Grafico 2 : Animado
graf2 +
  transition_layers(layer_order = c(2,1), # Altera a ordem das camadas. 
                    layer_length = 2,   # Altera a pausa entre as camadas
                    transition_length = 2)  # Altera o tempo para introduzir uma nova camada

Nesse mesmo exemplo gráfico. Podemos utilizar a função transition_states() que constrói o gráfico através de um subgrupo dado .

# Grafico 3 : Não animado
graf3 = base |> 
  ggplot(mapping = aes(x = gdpPercap,
                       y = lifeExp,
                       color = continent)) +
  geom_point() +
  geom_smooth(method = "lm")

graf3

graf3 +
  transition_states(states = continent,   # Variável de subgrupo da base
                    wrap = TRUE) +        # Modifica o reinicio do gif
  labs(x = "PIB per capito",
       y = "Expectativa de vida",
       color = "Continente",
       title = "Continente : {closest_state}")

Podemos ver no exemplo que o gráfico mostra a relação feita para cada Continente separadamente.

Utilizando as funções enter_() e exit_() podemos alterar o modo de como as camadas são adicionadas ou removidas durante o gif. Além existem outros comandos que podem ser utilizados. Como por exemplo ao usar a função trasition_states() temos:

  • closest_state: o nome da variável que gerou a camada atual.

  • next_state: o nome da variável que dará origem a proxima camada.

  • previous_state: o nome da variável que deu origem a camada anterior.

base |> 
  ggplot(mapping = aes(x = gdpPercap,
                       y = lifeExp,
                       color = continent)) +
  geom_point() +
  transition_states(continent) +
  labs(x = "PIB per capito",
       y = "Expectativa de vida",
       color = "Continente",
       title = "Continente : {closest_state}")  + 
  enter_fly()  # Especifica como os dados devem ser introduzidos

 base |> 
  ggplot(mapping = aes(x = gdpPercap,
                       y = lifeExp,
                       color = continent)) +
  geom_point() +
  transition_states(continent) +
  labs(x = "PIB per capito",
       y = "Expectativa de vida",
       color = "Continente",
       title = "Continente : {closest_state}",
       subtitle = "Proximo continente : {next_state}")  + 
   enter_grow() +  # Destaca os dados que acabaram de serem introduzidos
   exit_recolor()  # Retira os dados diminuindo a cor

Também é possível montar o gráfico através de camadas que sejam filtros da base com a função transition_filter() .

# Grafico utilizando a função transition_filter
base |> 
 ggplot(mapping = aes(x = gdpPercap,
                      y = lifeExp,
                      size = pop,
                      color = continent)) +
   geom_point() +
   theme_minimal() +
   transition_filter(America = continent == "Americas",
                     Asia =  continent == "Asia" ,
                     Populacao_alta = pop > 7.50e+08) +
   labs(title = "Filtro : {closest_filter}",
        size = "População",
        y = "Expectativa de vida",
        x = "População",
        color = "Continente")

5 Outros exemplos :

  • A função transition_manual() é parecido com a função transition_reveal() porém é utilizado quando o eixo X é uma variável discreta.
anim2 = ggplot(mtcars, aes(factor(gear), mpg)) +
  geom_boxplot() +
  transition_manual(gear, # Variável do eixo X
                    cumulative = TRUE) # Acumula as camadas 

anim2

  • A função transition_time() caso específico da transition_state() para quando a variável que irá alimentar a função é algo continuo ( Data/Contagem ).

    base |> 
      ggplot(mapping = aes(x = continent,
                           y = lifeExp)) +
      geom_boxplot() +
      transition_time(year) +
      labs(title = "Ano : {frame_time}",
           x = "Continente",
           y = "Expectativa de Vida") +
      theme_minimal() +
      enter_drift()

    Para mais especifições foi feito um EXTRA

6 Fontes de Referências:

Para fazer este trabalho foi utilizado como material de estudo o arquivo na web do pacote gganimate Link.

Além de usar um material complementar com alguns exercícios Link .

7 Meus Comentários :

Minha impressão inicial sobre o pacote era que ele seria um pacote muito difícil de ser usado devido a grande quantidade de funções e os minimos detalhes que aparecem usando elas , o que foi meio verdade .

A maior dificuldade inicialmente sobre o trabalho foi colocar o pacote para funcionar. Pois a prior, é necessário outros pacotes além do ggplot2 para roda-lo (Item 2) que não são apresentados no material do pacote. Com isso, tive que pesquisar nos forúns Github e Stackoverflow para achar os “pré-requisitos” para fazer o gganimate funcionar.

Porém, o pacote em si é razoavelmente fácil de ser usado , pois mesmo apresentando um vasta quantidade de funções poucas delas são realmentes “diferentes” , ou seja, existem muitas funções que fazem a mesma coisa que outras porém muda um detalhe.

O pacote gganimate tem como o seu principais as funções transitions_ que são responsáveis justamente pela criação do gif. No geral existem diversas outras funções do tipo que não foram citadas neste trabalho pelo motivo que não são tão apresentáveis para uma visualização grafica ou serem casos particulares de alguma outra (Ex : funções apresentadas no item 5). Sobre as funções que apresentei aqui achei que algumas deixam o seu gráfico mais apresentável (Ex : transition_reveal()) , além disso ajudam à poupar trabalho em fazer múltiplos gráfico e apresental-los em uma só imagem (Ex : transition_states() e transition_filter()).

Já as outras funções são modificações extras que mudam como é apresentada a animação do gráfico, existem diversas delas no pacote mas como dito anteriormente a maioria faz a mesma coisa que outra porém com um mínimo detalhe diferente o que dificulta saber o que específicamente cada uma delas faz.