Crear histogramas animados usando R

Crear histogramas animados usando R

Los gráficos de barras animados que se pueden incrustar directamente en una publicación de cualquier sitio web se están volviendo cada vez más populares. Muestran la dinámica de los cambios en cualquier característica durante un tiempo determinado y lo hacen con claridad. Veamos cómo crearlos usando R y paquetes genéricos.

Skillbox recomienda: Curso práctico "Desarrollador Python desde cero".

Recordamos: para todos los lectores de "Habr": un descuento de 10 rublos al inscribirse en cualquier curso de Skillbox utilizando el código promocional "Habr".

Paquetes

Necesitamos paquetes en R:

Estos dos son extremadamente necesarios. Además, se necesitarán tidyverse, conserje y básculas para administrar los datos, limpiar la matriz y formatear en consecuencia.

Datos

El conjunto de datos original que utilizaremos en este proyecto se descarga del sitio web del Banco Mundial. Aquí están - Datos del Banco Mundial. Los mismos datos, si los necesita ya preparados, se pueden descargar desde carpetas de proyectos.

¿Qué tipo de información es esta? La muestra contiene el valor del PIB de la mayoría de los países durante varios años (de 2000 a 2017).

Procesamiento de datos

Usaremos el código publicado a continuación para preparar el formato de datos requerido. Limpiamos los nombres de las columnas, convertimos los números a un formato numérico y convertimos los datos usando la función recopilar(). Guardamos todo lo que se recibe en gdp_tidy.csv para su 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

Su creación requiere dos etapas:

  • Trazar un conjunto completo de histogramas reales usando ggplot2.
  • Anime histogramas estáticos con los parámetros deseados usando gganimate.

El último paso es renderizar la animación en el formato deseado, incluido GIF o MP4.

Cargando bibliotecas

  • biblioteca (tidyverse)
  • biblioteca (gganimate)

Gestión de datos

En este paso, debe filtrar los datos para obtener los 10 países principales de cada año. Agreguemos varias columnas que nos permitirán mostrar una leyenda para el 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()

Construyendo histogramas estáticos

Ahora que tenemos un paquete de datos en el formato requerido, comenzamos a dibujar histogramas estáticos. Información básica: los 10 países principales con PIB máximo para el intervalo de tiempo seleccionado. Creamos gráficos para cada año.

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 gráficos usando ggplot2 es muy simple. Como puede ver en la sección de código anterior, hay varios puntos clave con la función theme(). Son necesarios para que todos los elementos se animen sin problemas. Es posible que algunos de ellos no se muestren si es necesario. Ejemplo: solo se dibujan las líneas de cuadrícula verticales y las leyendas, pero los títulos de los ejes y varios otros componentes se eliminan del área.

Анимация

La función clave aquí es Transition_states(), que une gráficos estáticos separados. view_follow() se utiliza para dibujar líneas de cuadrícula.

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

Una vez que la animación ha sido creada y almacenada en el objeto anim, es hora de renderizarla usando la función animate(). El renderizador utilizado en animate() puede ser diferente según el tipo de archivo de salida requerido.

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

Crear histogramas animados usando R

Como puedes ver, nada complicado. Todo el proyecto está disponible en mi GitHub, puedes usarlo como mejor te parezca.

Skillbox recomienda:

Fuente: habr.com

Añadir un comentario