Crie histogramas animados usando R

Crie histogramas animados usando R

Gráficos de barras animados que podem ser incorporados diretamente em uma postagem de qualquer site estão se tornando cada vez mais populares. Eles exibem a dinâmica das mudanças em quaisquer características ao longo de um determinado tempo e fazem isso com clareza. Vamos ver como criá-los usando R e pacotes genéricos.

A Skillbox recomenda: curso prático "Desenvolvedor Python do zero".

Lembramos: para todos os leitores de "Habr" - um desconto de 10 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

Pacotes

Precisamos de pacotes em R:

Esses dois são extremamente necessários. Além disso, serão necessários tidyverse, zelador e balanças para gerenciar os dados, limpar a matriz e formatar adequadamente.

Dados

O conjunto de dados original que usaremos neste projeto foi baixado do site do Banco Mundial. Aqui estão eles - Dados do Banco Mundial. Os mesmos dados, se precisar deles prontos, podem ser baixados em pastas do projeto.

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

Processamento de dados

Usaremos o código postado abaixo para preparar o formato de dados necessário. Limpamos os nomes das colunas, transformamos os números em um formato numérico e convertemos os dados usando a função reunir(). Salvamos tudo o que é recebido em gdp_tidy.csv para uso posterior.

library(tidyverse)
library(janitor)

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

#select required columns

gdp <- gdp %>% select(3:15)

#filter only country rows

gdp <- gdp[1:217,]

gdp_tidy <- gdp %>%
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:

  • Plotando um conjunto completo de histogramas reais usando ggplot2.
  • Anime histogramas estáticos com parâmetros desejados usando ganimate.

A etapa final é renderizar a animação no formato desejado, incluindo GIF ou MP4.

Carregando bibliotecas

  • biblioteca (diverso)
  • biblioteca (gganimado)

Gestão de dados

Nesta etapa, você precisa filtrar os dados para obter os 10 principais países de cada ano. Vamos adicionar várias colunas que nos permitirão exibir uma legenda para o histograma.

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

gdp_formatted <- gdp_tidy %>%
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 <=10) %>%
ungroup()

Construindo histogramas estáticos

Agora que temos um pacote de dados no formato necessário, começamos a desenhar histogramas estáticos. Informações básicas - os 10 principais países com PIB máximo no intervalo de tempo selecionado. Criamos gráficos 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"))

Criar gráficos usando ggplot2 é muito simples. Como você pode ver na seção de código acima, existem vários pontos-chave com a função theme(). Eles são necessários para que todos os elementos sejam animados sem problemas. Alguns deles podem não ser exibidos, se necessário. Exemplo: Somente as linhas verticais da grade e as legendas são desenhadas, mas os títulos dos eixos e vários outros componentes são removidos da área.

animação

A função principal aqui é transaction_states(), ela une gráficos estáticos separados. view_follow() é usado para desenhar linhas de grade.

anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'GDP per Year : {closest_state}',
subtitle = "Top 10 Countries",
caption = "GDP in Billions USD | Data Source: World Bank Data")

Renderização

Depois que a animação for criada e armazenada no objeto anim, é hora de renderizá-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

Crie histogramas animados usando R

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

A Skillbox recomenda:

Fonte: habr.com

Adicionar um comentário