library(tidyverse) packages <- installed.packages() DSOS_installed <- "DSOS" %in% packages[,"Package"] gganimate_installed <- "gganimate" %in% packages[,"Package"]
library(DSOS) data(twitch_data)
load("./data/twitch_data.rda")
Eine der größten Stärken von R liegt in der Visualisierung von Daten. Es gibt verschiedene Systeme in R, welche der Visualisierung von Daten dienen. Mit dem standardmäßig in R enthaltenen System lassen sich bereits sehr schöne Grafiken erstellen, allerdings muss man dabei einen bestimmten Befehlsablauf befolgen, in dem immer nur additiv agiert werden kann. So wird zunächst die "Leinwand" definiert und darauf dann immer mehr gezeichnet:
x <- rnorm(1000,0,1) y <- rnorm(1000,0,1) #"Leinwand" wird formatiert, wir wollen zwei Plots in einer Reihe par(mfrow=c(1,2)) #erster Plot wird gezeichnet plot(x,y) #in den ersten Plot wird etwas eingezeichnet abline(lm(y~x), col = "red") #der zweite Plot wird gezeichnet hist(x)
Dies führt dazu, dass wir sehr penibel und rigide auf die Reihenfolge achten müssen. Hinzukommt, dass sobald die Grafiken komplexer werden, wir sehr viel Code schreiben müssen, der sehr schnell sehr unübersichtlich wird. Ein anderer Ansatz zu Visualisierung in R stellt ggplot2 dar.
Das Paket ggplot2 ist ein alternativer Framework zur Erstellung von Grafiken mit R. Es basiert auf der grammar of graphics, der ein bestimmtes System, Grafiken zu formulieren, innewohnt. GGplot2 ist teil des tidyverses, funktioniert also besonders gut mit Daten die tidy sind und arbeitet reibungslos mit anderen Paketen des tidyverses, wie bspw. dplyr zusammen.
Der Syntax von ggplot ist zu Beginn etwas gewöhnungsbedürftig, aber wenn man es einmal raus hat, lassen sich sehr schnell sehr gute Grafiken produzieren. Wir gehen ihn mal der Reihe nach durch. Die Beispiele wurden dabei größtenteils aus dem passenden Kapitel aus R4DS übernommen.
library(tidyverse) #wir laden zunächst einen in ggplot2 enthaltenen Beispieldatensatz data(mpg) mpg #es geht wie ihr seht um Autos (genauer gesagt den Spritverbrauch)
Ein Plot beginnt immer mit dem ggplot()
Befehl:
ggplot(data = mpg) #zeichnet erstmal einen leeren plot
Wir können etwas in den Plot zeichnen, indem wir ein + schreiben, gefolgt von verschiedensten Befehlen:
ggplot(data = mpg)+ geom_point(mapping = aes(x = displ, y = hwy))
In diesem Fall haben wir zwei Dinge getan. Wir haben gesagt, dass wir einen Scatter-Plot haben wollen mit geom_point()
und haben innerhalb dieser Funktion ein Argument namens mapping
definiert. Dies haben wir mit der Funktion aes()
getan. Diese steht für aesthetics und gibt quasi an, was abgebildet werden soll. Wir geben also ein wie und ein was an. Man kann das was auch direkt am Anfang in die ggplot() Funktion einfügen, in diesem Fall werden die aesthetics für alle weiteren geoms übernommen!
Abgebildet wurde in diesem Fall eine Variable "displ" (englisch displacement, zu deutsch Hubraum) auf der x-Achse und eine Variable "hwy" (steht für highway, bedeutet im Kontext des Datensatzes den Spritverbrauch in miles per gallon auf dem Highway).
Wenn uns die Farbe der Punkte nicht gefällt, können wir sie anpassen. Beispielsweise so:
ggplot(data = mpg)+ geom_point(mapping = aes(x = displ, y = hwy), color = "turquoise") #wir können Farben entweder benennen (da haben wir nicht ganz so viel Auswahl), oder wir benutzen einen sogenannten "hexcode", das sieht dann bspw. so aus: #0af0cd #hex codes bekommt ihr über Google oder auch als RStudio addin!
Wir können auch das Aussehen der Punkte von anderen Eigenschaften abhängen lassen, bspw. ihre Farbe:
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, color = class)) #ist euch aufgefallen, dass das "color" argument jetzt innerhalb der aes() Funktion steht?
In diesem Fall haben wir eine weitere Variable "class" (steht für den Typ des Autos) mit aufgenommen, welche die Farbe der Punkte verändert. Wir könnten stattdessen auch die Form der Punkte verändern:
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, shape = class))
Oder die größe:
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, size = class))
Nicht so schön... Lieber wieder Farbe für Typ und Marke als Form:
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, color = class, shape = manufacturer))
Das sieht doch schon mal recht informativ aus (davon abgesehen, dass wir 15 Hersteller haben und nur 6 Formen und die Legende abgeschnitten ist...).
Mit ggplot2 wird es uns sehr einfach gemacht, mehrere Plots auf einmal zu machen. Dies wird durch die Funktion facet_wrap()
ermöglicht. Ich brauche der Funktion nur eine (nicht metrisch skalierte) Variable als Argument geben und erhalte für jedes Level der Variable einen eigenen Plot! In diesem Fall können dies bspw. 15 getrennte Plots für die 15 Hersteller sein:
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(mapping = aes(color = class))+ facet_wrap(~manufacturer)
Ich kann auch für jeden der Plots noch Regressionsgeraden einfügen:
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(mapping = aes(color = class))+ stat_smooth(method = "lm")+ facet_wrap(~manufacturer) #sogar mit Konfidenzintervallen!
Man kann so gut wie alles anpassen, was man möchte. Ein Titel lässt sich am einfachsten über ggtitle()
einfügen:
#ich kann Plots auch als Objekt speichern! standard_plot <- ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, color = class)) #dann muss ich nicht alles immer wiederholen: standard_plot + ggtitle("Hubraum vs. Spritverbrauch")
Den Titel kann ich natürlich auch noch beliebig anpassen (bspw. innerhalb der theme()
Funktion):
standard_plot + ggtitle("Hubraum vs. Spritverbrauch")+ theme(plot.title = element_text(hjust = 0.5, face = "bold", lineheight = 1, colour = "black")) #mit hjust ("horizontal justification") kann ich die horizontale Position definieren, in diesem Fall 0.5 = mittig
Über den selben Befehl kann ich auch bspw. die Legende und Achsenbeschriftung anpassen, die muss ich aber vorher nochmal gesondert definieren:
standard_plot + ggtitle("Hubraum vs. Spritverbrauch")+ xlab("Hubraum in Litern")+ ylab("Miles per Gallon Highway")+ theme(plot.title = element_text(hjust = 0.5, face = "bold", lineheight = 2, colour = "black"), axis.title = element_text(hjust = 0.5, face = "bold", lineheight = 0.5, colour = "grey"), legend.text = element_text(hjust = 0, face = "bold", lineheight = 0.2, colour = "grey"))
Ich kann natürlich auch den Hintergrund anpassen (Farbe, Rasterlinien...), die Achsenskala und eigentlich alles was ich möchte. Das wird dann aber wir ihr merkt schnell recht verbos. Wenn ich es schneller haben möchte, kann ich vorprogrammierte Themenpakete benutzen:
standard_plot+ theme_dark()
Es existieren mittlerweile eine Reihe weiterer Pakete, welche ggplot2 um Zusatzfunktionen erweitern. Eines meiner persönlichen Favoriten ist gganimate
, welches es erlaubt animierte Plots zu erstellen.
library(gganimate) twitch_data %>% group_by(pulled) %>% summarize(concurrent_viewers = sum(viewer_count)) %>% ggplot(aes(x=pulled, y=concurrent_viewers))+ geom_line(color = "#ffd700")+ transition_reveal(pulled)+ ggtitle("Gifs gehen auch?!?")+ theme(plot.title = element_text(hjust = 0.5, face = "bold", lineheight = 1, colour = "white"), panel.background = element_rect(fill = "#3c403d"), panel.grid=element_line(colour = "#3c403d"), plot.background=element_rect(fill="#3c403d"), axis.title = element_text(colour="white"), axis.line = element_line(colour="white"), axis.text= element_text(colour="white") )
Es gibt auch Pakete für Geodaten, wie bspw. ggmap
, mit welchen ihr Karten erstellen könnt (vielleicht dazu später mehr). Ein neueres Paket, welches ich sehr cool finde, ist Rayshader. Damit lassen sich (animierte) 3D-Plots erzeugen. (wie sowas hier)
Macht einfach irgendwas, lasst euch inspirieren!
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.