Creamos histogramas animados usando R

Creamos histogramas animados usando R

Los histogramas animados que se pueden incorporar directamente en publicaciones en cualquier sitio web son cada vez más populares. Muestran la dinámica de los cambios en cualquier característica durante un período determinado y lo hacen de manera visual. Veamos cómo crearlos utilizando R y paquetes universales.

Skillbox recomienda: Curso práctico «Desarrollador de Python desde cero».

Recordamos: para todos los lectores de «Habr» — un descuento de 10,000 rublos al registrarse en cualquier curso de Skillbox usando el código promocional «Habr».

Paquetes

Necesitamos los paquetes en R:

Estos dos son absolutamente necesarios. Además, se requieren tidyverse, janitor y scales para la gestión de datos, limpieza del conjunto y formateo respectivamente.

Datos

El conjunto de datos original que vamos a utilizar en este proyecto se descarga del sitio del Banco Mundial. Aquí están: WorldBank Data. Los mismos datos, si los necesitas en un formato listo, se pueden descargar de la carpeta del proyecto.

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

Procesamiento de datos

Utilizaremos el código que se muestra a continuación para preparar el formato de datos necesario. Limpiamos los nombres de las columnas, convertimos los números a formato numérico y transformamos los datos utilizando la función gather(). Todo lo obtenido se guarda en gdp_tidy.csv para su 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

Su creación requiere dos etapas:

  • Construcción de un conjunto completo de histogramas relevantes utilizando ggplot2.
  • Animación de histogramas estáticos con los parámetros deseados mediante gganimate.

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

Cargar bibliotecas

  • biblioteca(tidyverse)
  • library(gganimate)

Gestión de datos

En este paso, se deben filtrar los datos para obtener los 10 principales países de cada año. Agregaremos algunas columnas que permitirán mostrar la leyenda para el 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()

Construcción de histogramas estáticos

Ahora que tenemos un paquete de datos en el formato adecuado, comenzamos a dibujar histogramas estáticos. La información básica es los 10 principales países con el PIB más alto durante el intervalo de tiempo seleccionado. Crearemos 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 utilizando ggplot2 es bastante simple. Como pueden ver en el fragmento de código anterior, hay varios puntos clave con la función theme(). Son necesarios para que todos los elementos se animen sin problemas. Algunos de ellos se pueden ocultar si es necesario. Ejemplo: se dibujan solo las líneas verticales de la cuadrícula y las leyendas, mientras que los títulos de los ejes y varios otros componentes se eliminan del gráfico.

Animación

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

anim = staticplot + transition_states(año, transition_length = 4, state_length = 1) +
view_follow(fixed_x = VERDADERO) +
labs(title = 'PIB por Año : {closest_state}',
subtitle = "Las 10 Principales Países",
caption = "PIB en Miles de Millones USD | Fuente de Datos: Datos del Banco Mundial")

Renderizado

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

Creamos histogramas animados usando R

Como vemos, no hay nada complicado. Todo el proyecto está disponible en mi GitHub, pueden usarlo como consideren necesario.

Skillbox recomienda:

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster