Erstellen Sie animierte Histogramme mit R

Erstellen Sie animierte Histogramme mit R

Animierte Balkendiagramme, die direkt in einen Beitrag auf jeder Website eingebettet werden können, erfreuen sich immer größerer Beliebtheit. Sie zeigen die Dynamik von Veränderungen beliebiger Merkmale über einen bestimmten Zeitraum anschaulich an. Sehen wir uns an, wie man sie mit R und generischen Paketen erstellt.

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

Erinnerung: für alle Leser von „Habr“ – ein Rabatt von 10 Rubel bei der Anmeldung zu einem beliebigen Skillbox-Kurs mit dem Aktionscode „Habr“.

Pakete

Wir brauchen Pakete in R:

Diese beiden sind äußerst notwendig. Darüber hinaus werden Tidyverse, Janitor und Scales benötigt, um die Daten zu verwalten, das Array zu bereinigen und entsprechend zu formatieren.

Daten

Der Originaldatensatz, den wir in diesem Projekt verwenden werden, wird von der Website der Weltbank heruntergeladen. Hier sind sie - Daten der Weltbank. Die gleichen Daten können, wenn Sie sie fertig benötigen, unter heruntergeladen werden Projektordner.

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

Datenverarbeitung

Wir werden den unten veröffentlichten Code verwenden, um das erforderliche Datenformat vorzubereiten. Wir löschen die Spaltennamen, wandeln die Zahlen in ein Zahlenformat um und konvertieren die Daten mithilfe der Funktion „gather()“. Wir speichern alles, was wir erhalten, in gdp_tidy.csv zur weiteren Verwendung.

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

Animierte Histogramme

Ihre Erstellung erfordert zwei Schritte:

  • Zeichnen eines vollständigen Satzes tatsächlicher Histogramme mit ggplot2.
  • Animieren Sie statische Histogramme mit den gewünschten Parametern mit gganimate.

Der letzte Schritt besteht darin, die Animation im gewünschten Format zu rendern, einschließlich GIF oder MP4.

Laden von Bibliotheken

  • Bibliothek (aufräumen)
  • Bibliothek (ganimiert)

Datenmanagement

In diesem Schritt müssen Sie die Daten filtern, um die Top-10-Länder für jedes Jahr zu erhalten. Fügen wir mehrere Spalten hinzu, die es uns ermöglichen, eine Legende für das Histogramm anzuzeigen.

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

Statische Histogramme erstellen

Nachdem wir nun über ein Datenpaket im erforderlichen Format verfügen, beginnen wir mit dem Zeichnen statischer Histogramme. Grundlegende Informationen – Top 10 Länder mit maximalem BIP für das ausgewählte Zeitintervall. Wir erstellen Diagramme für jedes Jahr.

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 Plots mit ggplot2 ist sehr einfach. Wie Sie im Codeabschnitt oben sehen können, gibt es mehrere wichtige Punkte bei der theme()-Funktion. Sie sind notwendig, damit alle Elemente problemlos animiert werden können. Einige davon werden ggf. nicht angezeigt. Beispiel: Es werden nur die vertikalen Gitterlinien und Legenden gezeichnet, aber die Achsentitel und mehrere andere Komponenten werden aus dem Bereich entfernt.

Анимация

Die Schlüsselfunktion hier ist transit_states(), sie fügt separate statische Diagramme zusammen. view_follow() wird zum Zeichnen von Gitterlinien verwendet.

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

Rendern

Sobald die Animation erstellt und im Anim-Objekt gespeichert ist, ist es an der Zeit, sie mit der Funktion animate() zu rendern. Der in animate() verwendete Renderer kann je nach Art der erforderlichen 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 )

Erlebe die Kraft effektiver Ergebnisse

Erstellen Sie animierte Histogramme mit R

Wie Sie sehen, nichts Kompliziertes. Das gesamte Projekt ist verfügbar in mein GitHub, Sie können es nach Belieben verwenden.

Skillbox empfiehlt:

Source: habr.com

Kommentar hinzufügen