Erstellen von animierten Histogrammen mit R

Erstellen von animierten Histogrammen mit R

Animierte Histogramme, die direkt in die Publikation auf jeder Website eingebettet werden können, erfreuen sich zunehmender Beliebtheit. Sie zeigen anschaulich die Dynamik von Veränderungen verschiedener Merkmale über einen bestimmten Zeitraum. Lassen Sie uns ansehen, wie wir diese mit R und universellen Paketen erstellen können.

Skillbox empfiehlt: Praktischer Kurs „Python-Entwickler von Grund auf“.

Wir erinnern daran: alle Leser von „Habr“ erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode „Habr“.

Pakete

Wir benötigen folgende Pakete in R:

Diese beiden sind unerlässlich. Außerdem benötigen wir tidyverse, janitor und scales, um die Daten zu verwalten, das Array zu bereinigen und die Formatierung vorzunehmen.

Daten

Der originale Datensatz, den wir für dieses Projekt verwenden werden, kann von der Website der Weltbank heruntergeladen werden. Hier sind sie – WorldBank Data. Diese Daten können, falls Sie sie in fertiger Form benötigen, aus der Projektmappe.

Was sind das für Informationen? Die Stichprobe enthält das BIP der meisten Länder über mehrere Jahre (von 2000 bis 2017).

Datenbearbeitung

Wir werden den untenstehenden Code verwenden, um das benötigte Datenformat vorzubereiten. Wir bereinigen die Spaltennamen, konvertieren Zahlen in ein numerisches Format und wandeln die Daten mit der Funktion gather() um. Alles, was wir erhalten, wird in gdp_tidy.csv für die weitere Verwendung gespeichert.

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

Animierte Histogramme

Ihre Erstellung erfordert zwei Schritte:

  • Erstellung eines vollständigen Satzes aktueller Histogramme mit ggplot2.
  • Animation statischer Histogramme mit den gewünschten Parametern mithilfe von gganimate.

Der letzte Schritt ist das Rendern der Animation im gewünschten Format, einschließlich GIF oder MP4.

Laden der Bibliotheken

  • Bibliothek(tidyverse)
  • library(gganimate)

Datenmanagement

In diesem Schritt sollten die Daten gefiltert werden, um die Top 10 Länder jedes Jahres zu erhalten. Fügen wir einige Spalten hinzu, die es ermöglichen, die Legende für das Histogramm anzuzeigen.

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

Erstellung statischer Histogramme

Jetzt, wo wir die Daten im gewünschten Format haben, beginnen wir mit der Erstellung der statischen Histogramme. Die Basisinformation sind die Top 10 der Länder mit dem höchsten BIP im gewählten Zeitraum. Die Grafiken werden für jedes Jahr erstellt.

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

Grafiken mit ggplot2 zu erstellen, ist recht einfach. Wie Sie im obigen Codeabschnitt sehen können, gibt es einige wichtige Punkte mit der Funktion theme(). Diese sind notwendig, damit alle Elemente problemlos animiert werden. Einige davon können bei Bedarf nicht angezeigt werden. Beispiel: Nur die vertikalen Gitterlinien und Legenden werden gezeichnet, während Achsentitel und einige andere Komponenten entfernt werden.

Animation

Die Schlüssel-Funktion hier ist transition_states(), die einzelne statische Grafiken zusammenfügt. view_follow() wird verwendet, um die Gitterlinien zu zeichnen.

anim = staticplot + transition_states(jahr, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(titel = 'BIP pro Jahr: {closest_state}',
untertitel = "Top 10 Länder",
caption = "BIP in Milliarden USD | Datenquelle: Weltbank Daten")

Rendering

Nachdem die Animation erstellt und im Objekt anim gespeichert wurde, ist es Zeit, sie mit der Funktion animate() zu visualisieren. Der Renderer, der in animate() verwendet wird, kann je nach Art der benötigten Ausgabedatei variieren.

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 )

Ergebnis

Erstellen von animierten Histogrammen mit R

Wie wir sehen, ist nichts kompliziert. Das gesamte Projekt ist auf meinem GitHub, Sie können es nach Belieben nutzen.

Skillbox empfiehlt:

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster