Criando histogramas animados com R

Criando histogramas animados com R

Os histogramas animados, que podem ser incorporados diretamente nas publicações de qualquer site, estão se tornando cada vez mais populares. Eles mostram a dinâmica das alterações de quaisquer características ao longo do tempo de forma visual. Vamos ver como criá-los usando R e pacotes versáteis.

A Skillbox recomenda: Curso Prático "Desenvolvedor Python do zero".

Lembramos: para todos os leitores do «Habr» — desconto de 10.000 rublos na inscrição em qualquer curso Skillbox com o código promocional «Habr».

Pacotes

Precisamos de pacotes em R:

Esses dois são extremamente necessários. Além disso, precisarão do tidyverse, janitor e scales para manipulação de dados, limpeza de conjuntos e formatação, respectivamente.

Dados

O conjunto de dados original que usaremos neste projeto é carregado do site do Banco Mundial. Aqui estão eles — WorldBank Data. Os mesmos dados, se você precisar em formato pronto, podem ser baixados da pasta do projeto.

Que tipo de informação é essa? A amostra contém o valor do PIB da maioria dos países por vários anos (de 2000 a 2017).

Processamento de dados

Usaremos o código abaixo para preparar o formato necessário dos dados. Limparemos os nomes das colunas, converteremos números para formato numérico e transformaremos os dados usando a função gather(). Tudo o que for obtido será salvo em gdp_tidy.csv para uso posterior.

biblioteca(tidyverse)
biblioteca(janitor)

gdp <- read_csv("./data/GDP_Data.csv")

#select required columns

gdp % select(3:15)

#filter only country rows

gdp <- gdp[1:217,]

gdp_tidy %
mutate_at(vars(contains("YR")), as.numeric) %>%
gather(year, value, 3:13) %>%
janitor::clean_names() %>%
mutate(year = as.numeric(stringr::str_sub(year, 1, 4)))

write_csv(gdp_tidy, "./data/gdp_tidy.csv")

Histogramas animados

A sua criação requer duas etapas:

  • Construção de um conjunto completo de histogramas atualizados usando ggplot2.
  • Animação de histogramas estáticos com os parâmetros desejados usando gganimate.

O passo final — renderizar a animação no formato desejado, incluindo GIF ou MP4.

Carregar bibliotecas

  • biblioteca(tidyverse)
  • library(gganimate)

Manipulação de dados

Nesta etapa, devemos filtrar os dados para obter os top 10 países de cada ano. Adicionaremos algumas colunas que permitirão exibir a legenda para o histograma.

gdp_tidy <- read_csv("./data/gdp_tidy.csv")

gdp_formatted %
group_by(year) %>%
# The * 1 makes it possible to have non-integer ranks while sliding
mutate(rank = rank(-value),
Value_rel = value / value[rank == 1],
Value_lbl = paste0(" ", round(value / 1e9))) %>%
group_by(country_name) %>%
filter(rank %
ungroup()

Construção de histogramas estáticos

Agora que temos o pacote de dados no formato correto, começamos a desenhar histogramas estáticos. A informação básica — os top 10 países com o maior PIB durante o intervalo de tempo selecionado. Os gráficos serão feitos para cada ano.

staticplot = ggplot(gdp_formatted, aes(rank, group = country_name,
fill = as.factor(country_name), color = as.factor(country_name))) +
geom_tile(aes(y = value/2,
height = value,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(country_name, " ")), vjust = 0.2, hjust = 1) +
geom_text(aes(y=value,label = Value_lbl, hjust=0)) +
coord_flip(clip = "off", expand = FALSE) +
scale_y_continuous(labels = scales::comma) +
scale_x_reverse() +
guides(color = FALSE, fill = FALSE) +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="grey", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"),
plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"),
plot.background=element_blank(),
plot.margin = margin(2,2, 2, 4, "cm"))

Construir gráficos usando ggplot2 é bastante simples. Como você pode ver na seção de código acima, há vários pontos-chave na função theme(). Eles são necessários para que todos os elementos sejam animados sem problemas. Alguns deles podem até não ser exibidos, se necessário. Por exemplo: apenas as linhas verticais da grade e a legenda são desenhadas, enquanto os títulos dos eixos e alguns outros componentes são removidos da seção.

Animação

A função chave aqui é transition_states(), que conecta gráficos estáticos individuais. view_follow() é usada para desenhar as linhas da grade.

anim = staticplot + transition_states(ano, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(título = 'PIB por Ano : {closest_state}',
subtítulo = "Top 10 Países",
legenda = "PIB em Bilhões de USD | Fonte de Dados: Banco Mundial")

Renderização

Depois que a animação é criada e salva no objeto anim, é hora de visualizá-la usando a função animate(). O renderizador usado em animate() pode ser diferente, dependendo do tipo de arquivo de saída necessário.

GIF

# For GIF

animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = gifski_renderer("gganim.gif"))

MP4

# For MP4

animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = ffmpeg_renderer()) -> for_mp4

anim_save("animation.mp4", animation = for_mp4)

Resultado

Criando histogramas animados com R

Como podemos ver, nada complicado. Todo o projeto está disponível em meu GitHub, você pode usá-lo como achar necessário.

A Skillbox recomenda:

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster