Crea histogramas animados usando R

Crea histogramas animados usando R

Os gráficos de barras animados que se poden inserir directamente nunha publicación de calquera sitio web son cada vez máis populares. Mostran a dinámica dos cambios en calquera característica durante un tempo determinado e fano con claridade. Vexamos como crealos usando R e paquetes xenéricos.

Skillbox recomenda: Curso práctico "Desenvolvedor Python desde cero".

Recordámolo: para todos os lectores de "Habr" - un desconto de 10 rublos ao inscribirse en calquera curso de Skillbox usando o código promocional "Habr".

Paquetes

Necesitamos paquetes en R:

Estes dous son extremadamente necesarios. Ademais, será necesario tidyverse, conserxe e básculas para xestionar os datos, limpar a matriz e formatar en consecuencia.

Datos

O conxunto de datos orixinais que usaremos neste proxecto descárgase do sitio web do Banco Mundial. Aquí están - Datos do Banco Mundial. Os mesmos datos, se o necesitas listo, pódense descargar desde carpetas do proxecto.

Que tipo de información é esta? A mostra contén o valor do PIB da maioría dos países durante varios anos (de 2000 a 2017).

Tratamento de datos

Usaremos o código publicado a continuación para preparar o formato de datos necesario. Borramos os nomes das columnas, transformamos os números nun formato numérico e convertemos os datos mediante a función gather(). Gardamos todo o que se recibe en gdp_tidy.csv para o seu posterior uso.

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 súa creación require dúas etapas:

  • Trazar un conxunto completo de histogramas reais usando ggplot2.
  • Anima histogramas estáticos cos parámetros desexados usando gganimate.

O paso final é renderizar a animación no formato desexado, incluído GIF ou MP4.

Cargando bibliotecas

  • biblioteca (tidyverse)
  • biblioteca (gganimate)

Xestión de datos

Neste paso, cómpre filtrar os datos para obter os 10 principais países de cada ano. Engademos varias columnas que nos permitirán mostrar unha lenda 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()

Construción de histogramas estáticos

Agora que temos un paquete de datos no formato necesario, comezamos a debuxar histogramas estáticos. Información básica: os 10 principais países con PIB máximo para o intervalo de tempo seleccionado. Creamos 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"))

Crear tramas usando ggplot2 é moi sinxelo. Como podes ver na sección de código anterior, hai varios puntos clave coa función theme(). Son necesarios para que todos os elementos se animen sen problemas. É posible que algúns deles non se mostren se é necesario. Exemplo: só se debuxan as liñas de grade verticais e as lendas, pero os títulos dos eixes e outros compoñentes elimínanse da área.

Animación

A función clave aquí é transition_states(), que une gráficos estáticos separados. view_follow() úsase para debuxar liñas 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")

Representación

Unha vez creada e almacenada a animación no obxecto anim, é hora de renderizala usando a función animate(). O renderizador usado en animate() pode ser diferente dependendo do tipo de ficheiro de saída necesario.

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

Crea histogramas animados usando R

Como vedes, nada complicado. Todo o proxecto está dispoñible en meu github, podes usalo como creas oportuno.

Skillbox recomenda:

Fonte: www.habr.com

Engadir un comentario