# Instalação do pacote gganimate
install.packages("gganimate")Trabalho de Métodos Computacionais
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').
Dependendo do sistema operacional do computador ( Linux ou versã antiga do Windows) será necessário o uso de outro dois pacotes:
pngpacote utilizado para compilar um conjunto de imagens/arquivos do tipo .png .gifskipacote 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")
graf1Agora 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)
graf1Agora 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")
graf2Utilizando 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 camadaNesse 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")
graf3graf3 +
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 corTambé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çãotransition_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
anim2A função
transition_time()caso específico datransition_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.