Crea histogramas animados usando R



Los histogramas animados que puede insertar directamente en una publicación en cualquier sitio son 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 universales.

Skillbox recomienda: el programa práctico Python Developer desde cero .

Le recordamos: para todos los lectores de "Habr": un descuento de 10.000 rublos al registrarse en cualquier curso de Skillbox con el código de promoción "Habr".

Paquetes


Necesitamos paquetes en R:


Estos dos son esenciales. Además, tidyverse, conserje y escalas son necesarios para administrar los datos, borrar la matriz y formatear, respectivamente.

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 en forma terminada, se pueden descargar desde la carpeta del proyecto .

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

Procesamiento de datos


Usaremos el siguiente código para preparar el formato de datos requerido. Borramos los nombres de las columnas, convertimos los números a un formato numérico y convertimos los datos usando la función de recolección (). Todo lo que se recibe se almacena en gdp_tidy.csv para uso futuro.

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") 

Gráficos de barras animados


Su creación requiere dos etapas:

  • Construyendo un conjunto completo de histogramas relevantes usando ggplot2.
  • Animando histogramas estáticos con los parámetros deseados usando gganimate.

El paso final es renderizar la animación en el formato deseado, incluyendo GIF o MP4.

Cargando bibliotecas


  • biblioteca (tidyverse)
  • biblioteca (gganimate)

Gestión de datos


En este paso, debe filtrar los datos para obtener los 10 principales países de cada año. Agregue algunas columnas que le permitan mostrar la leyenda del 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 el paquete de datos en el formato deseado, comenzamos a dibujar los histogramas estáticos. Información básica: los 10 principales países con PIB máximo para el intervalo de tiempo seleccionado. Construimos cuadros 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")) 

Construir gráficos usando ggplot2 es bastante simple. Como puede ver en la sección de código anterior, hay algunos puntos clave con la función theme (). Son necesarios para que todos los elementos estén animados sin problemas. Algunos de ellos pueden no mostrarse si es necesario. Ejemplo: solo se dibujan líneas de cuadrícula verticales y leyendas, pero los encabezados de los ejes y algunos componentes más se eliminan del sitio.

Animación


La función clave aquí es transition_states (), pega gráficos estáticos separados. view_follow () se usa 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") 

Renderizado


Después de crear y guardar la animación en el objeto anim, es hora de visualizarla usando la función animate (). El renderizador utilizado en animate () puede variar 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




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

Skillbox recomienda:

Source: https://habr.com/ru/post/446952/


All Articles