Creeu histogrames animats amb R

Creeu histogrames animats amb R

Els gràfics de barres animats que es poden incrustar directament a una publicació de qualsevol lloc web són cada cop més populars. Mostren la dinàmica dels canvis de qualsevol característica durant un temps determinat i ho fan amb claredat. Vegem com crear-los amb R i paquets genèrics.

Skillbox recomana: Curs pràctic "Desenvolupador Python des de zero".

Recordem: per a tots els lectors de "Habr": un descompte de 10 rubles en inscriure's a qualsevol curs de Skillbox amb el codi promocional "Habr".

Paquets

Necessitem paquets en R:

Aquests dos són extremadament necessaris. A més, caldrà tidyverse, conserge i bàscules per gestionar les dades, netejar la matriu i formatar en conseqüència.

Dades

El conjunt de dades original que utilitzarem en aquest projecte es descarrega del lloc web del Banc Mundial. Aquí estan - Dades del Banc Mundial. Les mateixes dades, si les necessiteu ja fetes, es poden descarregar des de carpetes del projecte.

Quin tipus d'informació és aquesta? La mostra conté el valor del PIB de la majoria dels països durant diversos anys (del 2000 al 2017).

Processament de dades

Utilitzarem el codi publicat a continuació per preparar el format de dades requerit. Netegem els noms de les columnes, convertim els números en un format de nombre i convertim les dades mitjançant la funció gather(). Desem tot el que rebem a gdp_tidy.csv per a un ús 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")

Histogrames animats

La seva creació requereix dues etapes:

  • Traçant un conjunt complet d'histogrames reals amb ggplot2.
  • Animeu histogrames estàtics amb els paràmetres desitjats mitjançant gganimate.

El pas final és renderitzar l'animació en el format desitjat, incloent GIF o MP4.

Càrrega de biblioteques

  • biblioteca (tidyverse)
  • biblioteca (gganimate)

Gestió de dades

En aquest pas, heu de filtrar les dades per obtenir els 10 països principals de cada any. Afegim diverses columnes que ens permetran mostrar una llegenda per a l'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()

Construcció d'histogrames estàtics

Ara que tenim un paquet de dades en el format requerit, comencem a dibuixar histogrames estàtics. Informació bàsica: els 10 principals països amb PIB màxim per a l'interval de temps seleccionat. Elaborem gràfics per a cada any.

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 trames amb ggplot2 és molt senzill. Com podeu veure a la secció de codi anterior, hi ha diversos punts clau amb la funció theme(). Són necessaris perquè tots els elements s'animin sense problemes. És possible que alguns d'ells no es mostrin si cal. Exemple: només es dibuixen les línies de la quadrícula vertical i les llegendes, però els títols dels eixos i altres components s'eliminen de l'àrea.

Animació

La funció clau aquí és transition_states(), uneix gràfics estàtics separats. view_follow() s'utilitza per dibuixar línies de quadrí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ó

Un cop creada i emmagatzemada l'animació a l'objecte animat, és hora de representar-la mitjançant la funció animate(). El renderitzador utilitzat a animate() pot ser diferent segons el tipus de fitxer de sortida requerit.

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 )

Resultat

Creeu histogrames animats amb R

Com podeu veure, res complicat. Tot el projecte està disponible a el meu GitHub, podeu utilitzar-lo com us convingui.

Skillbox recomana:

Font: www.habr.com

Afegeix comentari