Creăm histograme animate folosind R

Creăm histograme animate folosind R

Histogramă animată, care pot fi integrate direct în publicație pe orice site, devin din ce în ce mai populare. Acestea afișează dinamica modificărilor diferitelor caracteristici pe o anumită perioadă de timp și fac acest lucru într-un mod vizual. Să vedem cum le putem crea cu ajutorul R și al pachetelor universale.

Skillbox recomandă: Curs practic „Dezvoltator Python de la zero”.

Vă reamintim: pentru toți cititorii „Habr” — reducere de 10.000 de ruble la înscrierea la orice curs Skillbox cu codul de promovare „Habr”.

Pachete

Avem nevoie de pachete în R:

Acestea două sunt absolut necesare. În plus, vor fi necesare tidyverse, janitor și scales pentru gestionarea datelor, curățarea setului de date și formatarea respectiv.

Date

Setul original de date pe care îl vom folosi în acest proiect este descărcat de pe site-ul Băncii Mondiale. Iată-l — Date WorldBank. Aceleași date, dacă aveți nevoie de ele în format gata-făcut, pot fi descărcate din folderul proiectului.

Ce informație conține aceasta? Eșantionul conține valoarea PIB-ului majorității țărilor pe parcursul mai multor ani (între 2000 și 2017).

Procesarea datelor

Vom utiliza codul publicat mai jos pentru a pregăti formatul de date necesar. Curățăm denumirile coloanelor, transformăm cifrele în format numeric și convertim datele folosind funcția gather(). Tot ce obținem se salvează în gdp_tidy.csv pentru utilizări ulterioare.

library(tidyverse)
library(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")

Histogramă animată

Crearea lor necesită două etape:

  • Construirea unui set complet de histograme actualizate folosind ggplot2.
  • Animarea histogramelor statice cu parametrii doriți folosind gganimate.

Pasul final — redarea animației în formatul dorit, inclusiv GIF sau MP4.

Încărcarea bibliotecilor

  • library(tidyverse)
  • library(gganimate)

Gestionarea datelor

În acest pas, este necesar să filtrăm datele pentru obținerea primelor 10 țări din fiecare an. Vom adăuga câteva coloane care vor permite afișarea unei legende pentru histogramă.

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

Construirea histogramelor statice

Acum, când avem pachetul de date în formatul necesar, începem să desenează histogramelor statice. Informația de bază — primele 10 țări cu cel mai mare PIB pe parcursul intervalului de timp ales. Graficele sunt construite pentru fiecare an.

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

Crearea graficelor cu ajutorul ggplot2 este destul de simplă. Așa cum puteți observa în secțiunea de cod de mai sus, există câteva aspecte esențiale în funcția theme(). Acestea sunt necesare pentru ca toate elementele să fie animate fără probleme. Unele dintre ele pot fi ascunse, dacă este necesar. De exemplu: se desenează doar liniile verticale ale rețelei și legenda, în timp ce titlurile axelor și câteva alte componente sunt eliminate din secțiune.

Animație

Funcția cheie aici este transition_states(), care îmbină graficele statice separate. view_follow() este utilizată pentru a desena liniile rețelei.

anim = staticplot + transition_states(an, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = ' PIB pe an : {closest_state}',
subtitle = "Primele 10 țări",
caption = "PIB în miliarde USD | Sursa datelor: World Bank Data")

Redare

După ce animația este creată și salvată în obiectul anim, vine momentul să o vizualizăm cu ajutorul funcției animate(). Rendererul folosit în animate() poate varia în funcție de tipul de fișier de ieșire dorit.

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 )

Rezultatul

Creăm histograme animate folosind R

După cum vedem, nimic complicat. Întregul proiect este disponibil pe GitHub-ul meu, îl puteți folosi așa cum considerați necesar.

Skillbox recomandă:

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster