Animando histogramas ggplot2 com gganimate

Já publiquei vários posts contendo animações gganimate. Para programadores ou analistas de R com proficiência em R este é um pacote muito interessante. Ele converte ggplot2-plots em animações. Veja, por exemplo, meu post no blog apresentando o comtradr para análise de comércio internacional (contendo uma animação criada com gganimate) e meu post contendo animações de dados espaciais da propagação de espécimes espaciais.

gganimate é compatível com ggplot2. Como o ggmap é basicamente uma forma estendida do ggplot2, o gganimate também funciona com o pacote ggmap.

Neste artigo, quero demonstrar como você pode animar histogramas ggplot2 com gganimate em R. Vou trabalhar com dados produzidos artificialmente, ou seja, dados fabricados sob medida.

Criando dados artificiais para obter um conjunto de dados de trabalho

Em um primeiro exemplo, crio um conjunto de dados artificiais que contém um valor de observação (por exemplo, idade no casamento, idade dos pais ao nascer, expectativa de vida ou outro) que é distribuído aleatoriamente em torno de uma média. Vou deixar essa distribuição “mudar” com o tempo.

Para ser preciso, usarei a distribuição normal aleatória com uma média definida e um desvio padrão que aumenta ligeiramente ano a ano. Vou considerar 21 anos, começando em 2000 e terminando no ano de 2020 (última observação de 2020). Em cada ano, 1.000 pontos de dados foram coletados para a variável fictícia observada.

Abaixo eu configurei o conjunto de dados artificial.

# conjunto de dados
dataset = as.data.frame(matrix(nrow=21000,ncol=2))
# nomes de coluna
colnames(dataset) = c("year","obsVal")
# cria dados artificiais
for(i in 2000:2020){
  for(j in 1:1000){
    obsval = rnorm(n=1,mean=30,sd=3+(i-1999)/10)[1]
    dataset$year[(i-2000)*1000 + j] = i
    dataset$obsVal[(i-2000)*1000 + j] = obsval
  }
}
# ver o cabeçalho do conjunto de dados
head(dataset)
  ano<int>obsVal<dbl>
1200028.92808
2200026.43280
3200027.87782
4200027.17254
5200027.91719
6200029.11332

A dispersão nos dados para uma variável de observação, como aquela medida com valores de observação aqui, pode, por exemplo, ser explorado usando um histograma.

Animação de distribuições dependentes do tempo: Histograma ao longo do tempo

Vou criar uma animação com gganinate que percorre os histogramas para cada ano, ou seja, mostra um histograma para cada ano. O truque de fazer isso é primeiro criar um histograma no ggplot2, para cada ano.

# importa pacotes relevantes
library(gganimate)
## Carregando pacote necessário: ggplot2
library(ggplot2)
# cria plot ggplot2
ggplot(dataset) + 
  geom_histogram(mapping=aes(y=obsVal,group=year),bins=100,col="red",fill="red") + 
  ggtitle("Distribution of observation values") +
  labs(subtitle=("Year: {closest_state}")) +
  xlab("Absolute frequency") + 
  ylab("Observation value [-]") + 
  transition_states(year, transition_length = 3, state_length = 1)
# salve a animação como GIF
anim_save("histograms.gif")

Direção de rotação do histograma ggplot2

Como alguns preferem que os histogramas apontem para o céu, também posso girar o histograma em 90 graus:

# cria plot ggplot2
ggplot(dataset) + 
  geom_histogram(mapping=aes(x=obsVal,group=year),bins=100,col="red",fill="red") + 
  ggtitle("Distribution of observation values") +
  labs(subtitle=("Year: {closest_state}")) +
  ylab("Absolute frequency") + 
  xlab("Observation value [-]") + 
  transition_states(year, transition_length = 3, state_length = 1)
# salve a animação como GIF
anim_save("histogram90.gif")

Leave a Reply

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Close

Meta