Erstellen von animierten Histogrammen mit R

Erstellen von animierten Histogrammen mit R

Animierte Histogramme, die direkt in Veröffentlichungen auf jeder Website eingebettet werden können, werden immer beliebter. Sie zeigen dynamisch die Veränderungen beliebiger Merkmale über einen bestimmten Zeitraum und tun dies anschaulich. Lassen Sie uns ansehen, wie man sie mit R und universellen Paketen erstellt.

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 Pakete in R:

Diese beiden sind unbedingt erforderlich. Darüber hinaus sind tidyverse, janitor und scales zur Datenverwaltung, zur Bereinigung des Datensatzes und zur Formatierung erforderlich.

Daten

Der originale Datensatz, den wir in diesem Projekt verwenden werden, wird von der Website der Weltbank heruntergeladen. Hier sind sie - WorldBank Data. Die gleichen Daten, falls Sie sie in fertiger Form benötigen, können Sie aus der Projektmappe.

Was ist das für eine Information? Die Stichprobe enthält die BIP-Werte der meisten Länder über mehrere Jahre (von 2000 bis 2017).

Datenverarbeitung

Wir werden den untenstehenden Code verwenden, um das erforderliche Datenformat vorzubereiten. Wir bereinigen die Spaltennamen, konvertieren Zahlen in ein numerisches Format und wandeln die Daten mithilfe 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 von statischen Histogrammen 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 müssen 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, da wir ein Paket von Daten im erforderlichen Format haben, beginnen wir mit dem Zeichnen statischer Histogramme. Die Grundinformationen sind die Top 10 Länder mit dem höchsten BIP über den 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"))

Das Erstellen von Grafiken mit ggplot2 ist recht einfach. Wie im obigen Codeabschnitt zu sehen ist, gibt es einige Schlüsselpunkte zur Funktion theme(). Diese sind notwendig, damit alle Elemente problemlos animiert werden. Einige davon können bei Bedarf auch nicht angezeigt werden. Ein Beispiel: Es werden nur die vertikalen Gitternetzlinien und Legenden gezeichnet, während die 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 Gitternetzlinien darzustellen.

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

Rendering

Nachdem die Animation erstellt und im Objekt anim gespeichert wurde, ist es an der Zeit, sie mit der Funktion animate() zu visualisieren. Der Renderer, der in animate() verwendet wird, kann je nach Art der gewünschten Ausgabedatei unterschiedlich sein.

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 das nichts Kompliziertes. Das gesamte Projekt ist verfügbar auf meinem GitHub, Sie können es nutzen, wie Sie es für richtig halten.

Skillbox empfiehlt:

Quelle: habr.com

60GB SSD 8Gb DDR4