
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 .
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:
- ggplot2
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 — . Os mesmos dados, se você precisar em formato pronto, podem ser baixados da .
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

Como podemos ver, nada complicado. Todo o projeto está disponível em , você pode usá-lo como achar necessário.
A Skillbox recomenda:
- Curso Prático de Dois Anos .
- Curso online .
- Curso prático de um ano .
Fonte: habr.com
