5  Visualisierungen

5.1 ggplot

In diesem Modul lernen Sie die Grundlagen, wie man mit Hilfe des R-Pakets ggplot2 Daten grafisch darstellt. Visualisierungen spielen nicht nur in diesem Kapitel eine Rolle, sondern im gesamten weiteren Semesterverlauf. Die beiden gg in ggplot sind eine Abkürzung für “grammar of graphics”. Eine sehr ausführliche Einführung (die allerdings weit über das hinausgeht, was für dieses Modul relevant ist) gibt das eBuch ggplot2: Elegant Graphics for Data Analysis von Hadley Wickham.

Im Folgenden wird anhand einiger einfacher Beispiele gezeigt, wie die “Philosophie” der Funktion ggplot aussieht. Als Beispieldatensatz nutzen wir einen kleinen aufbereiteten Auszug aus der International Movie Database (imdb.csv).

Sie können den Datensatz von der Learnweb-Seite der Vorlesung herunterladen. Der Datensatz enthält die folgenden Variablen:

imdb <- read_csv("../data/imdb.csv",
                 col_types = "ccnfnnnnnn")
names(imdb)
 [1] "title_id"    "title"       "year"        "genre"       "duration"   
 [6] "avgvote"     "budget"      "grossinc"    "users_rev"   "critics_rev"

Die Variable title_id ist eine eindeutige Kennung für jeden Film, mit dem weitere Daten aus anderen Datenbanken zugespielt werden könnten, title ist der Filmtitel, year das Jahr des Erscheinens, genre gibt das Genre an (diese Variable wurde im Vergleich zum Originaldatensatz deutlich vergöbert), avgvote ist das durchschnittliche Rating des Films, budget das Budget in Mio. US-Dollars (es wurden nur Filme betrachtet, deren Budget in US-Dollars angegeben war), grossinc ist die Höhe des eingespielten Betrags (ebenfalls in Mio. US-Dollars), die beiden Variablen users_rev und critics_rev geben an, wieviele Film-Reviews von den Nutzern und von Kritikern verfasst wurden.

Grafiken zeigen Daten, also muss zunächst festgelegt werden, welcher Dataframe die Daten enthält. Außerdem muss angegeben werden, welche Variablen auf welche Weise gezeigt werden sollen. In ggplot nennt man die Art und Weise, wie die Variablen grafisch dargestellt werden, aesthetic attributes.

Wir möchten nun aus dem Dataframe imdb die Variablen budget und avgvote grafisch darstellen. Mit dem folgenden Befehl wird die Grafik vorbereitet:

p <- ggplot(imdb, aes(x=budget, y=avgvote))

Die Daten sind im Dataframe imdb gespeichert. Die beiden Variablen budget und avgvote sollen als Aesthetics (aes) angezeigt werden, und zwar soll budget auf der x-Achse und avgvote auf der y-Achse abgetragen werden (die Angaben x= und y= könnte man auch weglassen, weil es sich um die Standardangaben für ein Streudiagramm handelt). Das von der Funktion ggplot erzeugte Objekt p ist die (noch leere) Grafik. Man kann sie durch print(p) (oder einfach p) anzeigen lassen.

print(p)

5.2 Streudiagramme

Die Grafik kann nun mit verschiedenen Schichten (layers) angefüllt werden. Um Bestandteile zu der Grafik hinzuzufügen, benutzt man das Pluszeichen. Wie die Aesthetics grafisch umgesetzt werden sollen, wird durch sogenannte Geoms angegeben. Wir starten mit dem wohl wichtigsten Geom, nämlich Punkten. Eine Punktewolke erzeugen wir mit dem Befehl:

p + geom_point()

oder

ggplot(imdb, aes(x=budget, y=avgvote)) + geom_point() 

Wir können weitere Bestandteile zu der Grafik hinzufügen, zum Beispiel andere Achsenbeschriftungen und eine Überschrift:

ggplot(imdb, aes(x=budget, y=avgvote)) + 
    geom_point() +
    xlab("Filmbudget (in Mio. Dollar)") +
    ylab("Average vote") +
    ggtitle("Internet Movie Database")

Zeilenumbrüche sind nicht notwendig, erleichtern aber die Lesbarkeit des Codes. Umbrüche sollten immer nach (nicht vor) dem Pluszeichen erfolgen.

In einer Punktewolke können auch weitere Variablen als Aesthetics ergänzt werden. Beispielsweise kann die Farbe oder Größe der Punkte Informationen über eine weitere Variable widerspiegeln.

ggplot(imdb, aes(x=budget, y=avgvote, colour=genre)) + 
    geom_point() +
    xlab("Filmbudget (in Mio. Dollar)") +
    ylab("Average vote") +
    ggtitle("Internet Movie Database")

Sofern man nicht an einer Farbsehschwäche leidet, erkennt man an dieser Grafik schnell, dass Action-Filme besonders teuer sind. Sie sollten bei der Erstellung einer farbigen Grafik jedoch bedenken, dass vor allem die Rot-Grün-Sehschwäche recht weit verbreitet ist. Informationen, die durch rote und grüne Farbe symbolisiert wird, sind für Menschen mit einer Rot-Grün-Schwäche nicht erkennbar. Es gibt in R die Möglichkeit, inklusive Farbpaletten zu wählen, die auch dann unterscheidbar sind, wenn eine Farbsehschwäche vorliegt. Hinweise und Tipps zur Farbgestaltung findet man auf vielen Internetseiten (z.B. mit den Suchbegriffe ggplot und colorblind). Wir gehen in diesem Kurs jedoch nicht weiter darauf ein.

Natürlich werden Daten nicht immer nur als Punktewolken gezeigt, sondern auch als Boxplots, Histogramme, Säulen- oder Balkendiagramme, Linien usw. Alle diese Formen von Grafiken lassen sich bequem mit ggplot erzeugen. Wir gehen im Laufe des Semesters näher darauf ein.

Da die Funktion ggplot als erstes Argument immer einen Dataframe erwartet, kann man sie bequem ans Ende einer Pipe setzen. Man wählt zunächst die Beobachtungen aus, für die man eine Grafik erzeugen will, und lässt sich anschließend durch ggplot darstellen.

Wenn wir beispielsweise die letzte Grafik nur die Filme des Jahres 2020
zeigen möchten, können wir folgendes eingeben:

imdb %>% 
    filter(year == 2020) %>%
    ggplot(aes(x=budget, y=avgvote, colour=genre)) + 
        geom_point(size=2) +
        xlab("Filmbudget (in Mio. Dollar)") +
        ylab("Average vote") +
        ggtitle("Internet Movie Database, Filme aus 2020")

Wegen der Pipe entfällt das erste Argument (nämlich der Dataframe) in der ggplot-Funktion, nur die Aesthetics werden angegeben. Da nur wenige Punkte übrig bleiben, sind sie etwas größer gezeichnet. Das erreicht man mit der Option size in geom_point.

5.3 Linien-Diagramme

Neben den Streudiagrammen sind Liniendiagramme oft hilfreich, besonders wenn man sich den Verlauf einer Variable über die Zeit hinweg ansehen möchte. Die Zeit ist in diesem Fall auch eine Variable. In R wird sie oft als eigener Datentyp gespeichert, aber das spielt hier erst einmal keine Rolle.

Wir betrachten den Datensatz fahrrad2023.csv. Eine Beschreibung des Datensatzes findet man im Anhang D.

rad <- read.csv("../data/fahrrad2023.csv")

Der Dataframe rad enthält u.a. die Variable beob. Sie gibt an, in der wie vielten Stunde des Jahres 2023 die Beobachtung gemacht wurde. Die Variable temp enthält die Temperatur für jede Stunde des Jahres. Der Temperaturverlauf über das ganze Jahr kann durch eine Linie dargestellt werden.

ggplot(rad, aes(x=beob, y=temp))+
    geom_line()

Zur Erklärung: Das erste Argument ist wieder der Dataframe rad, der die Variablen beinhaltet. Anschließend werden die Aesthetics aufgeführt, hier die Variable beob (also die Zeit) auf der x-Achse und die Variable temp auf der y-Achse. Durch das Pluszeichen wird klar, dass der Befehl noch nicht zu Ende ist. In der zweiten Zeile wird das Linien-Geom ausgewählt. Nun werden alle Datenpunkte in der Reihenfolge, in der sie vorliegen, mit einer Linie verbunden.

Auch hier kann man den ggplot-Befehl an das Ende einer Pipe setzen, wenn man die Grafik nur für eine Teilmenge zeigen möchte. Die nächste Linie zeigt die Zahl der Fahrräder, die in der ersten Hälfte des Monats Mai auf dem Weg in die Stadt hinein gezählt wurden.

rad %>% 
    filter(monat==5, tag <= 15) %>%
    ggplot(aes(x=beob, y=rein))+
        geom_line()

Man erkennt an der Abbildung sehr deutlich die Tages-Saisonalität. In der Nacht sind nur wenige Personen unterwegs, am Morgen gibt es meistens eine Spitze und gegen Abend eine zweite Spitze. Auffällig ist auch, dass am Wochenende weniger Personen mit dem Rad in die Stadt bzw. aus der Stadt fahren.

Die Linieneigenschaften können Sie durch Angabe von weiteren Argumenten ändern. Dazu gehören vor allem

  • die Farbe mit dem Argument colour (oder color). Die Farbe kann am einfachsten verbal festgelegt werden, z.B. colour="red" oder colour="blue".
  • der Linientyp mit dem Argument linetype. Die wichtigsten Typen sind solid (eine durchgezogene Linie, dies ist die Standardeinstellung), dashed (gestrichelt) und dotted (gepunktet).
  • die Liniendicke mit dem Argument size. Die Dicke wird durch eine Zahl angegeben. Je höher, desto dicker ist die Linie. Mit size=5 wird schon eine ziemlich dicke Linie generiert.

Es ist durchaus möglich mehrere Geoms gleichzeitig in eine Abbildung zu setzen. Die nächste Abbildung zeigt die Zahl der Fahrräder, die am 22. Juni am Neutor stadtauswärts gezählt wurden. An diesem Tag gab es am Nachmittag kräftigen Regen. In der Grafik werden sowohl Punkte als auch Linien für die Darstellung genutzt.

rad %>%
    filter(monat==6, tag==22) %>%
    ggplot(aes(x=stunde, y=raus)) +
        geom_line() +
        geom_point()

Sowohl für die Linien als auch für die Punkte lassen sich die Standardeinstellung für die Eigenschaften verändern. In dem folgenden Plot werden die Linien gepunktet gezeichnet und die Punkte sind größer und rot.

rad %>%
    filter(monat==6, tag==22) %>%
    ggplot(aes(x=stunde, y=raus)) +
        geom_line(linetype="dotted") +
        geom_point(size=3,colour="red")

Es ist auch möglich, mehrere Linien in einer Grafik zu zeigen. Dazu werden als Argument zu einem Geom neue Aesthetics angegeben. Die folgende Abbildung zeigt in rot die Zahl der Fahrräder, die am 22.6.2023 stadtauswärts gezählt wurden, und in blau die Zahl der Fahrräder, die stadteinwärts gezählt wurden.

rad %>%
    filter(monat==6, tag==22) %>%
    ggplot(aes(x=stunde, y=raus)) +
        geom_line(colour="red") +
        geom_line(aes(x=stunde, y=rein), colour="blue")

Sie werden später im Kurs noch weitere Möglichkeiten kennen lernen, Farben als Aesthetics einzusetzen.

5.4 Zusätzliche Grafikelemente

Wir haben bereits gesehen, wie man die Achsenbeschriftung einer Grafik anpasst und wie man einen Titel hinzufügt. Um Grafiken leichter lesbar zu machen, sind manchmal weitere zusätzliche Elemente hilfreich. Das können zusätzliche waagerechte oder senkrechte Linien sein oder auch zusätzlicher Text. Seien Sie nicht beunruhigt, wenn es am Anfang lange dauert, die Grafik so zu gestalten, wie Sie sie gerne haben möchten. Überlegen Sie aber immer, ob sich der Zeitaufwand wirklich lohnt, Details an der Grafik zu verändern. Denn für Grafikverschönerungen gilt die

Erste Goldene Regel: Tu’s nicht.

Und wenn sich diese Regel nicht einhalten lässt, lautet die

Zweite Goldene Regel: Tu’s noch nicht.

Wir gehen in diesem Kurs nicht auf alle Möglichkeiten ein, sondern zeigen nur anhand von zwei Beispielen, wie man im Prinzip vorgeht. Für weitergehende spezielle Wünsche sei auf die üblichen Hilfemöglichkeiten verwiesen (s. Kapitel 1.4).

Beispiel: Vertikale Linien

Wir betrachten weiterhin den Datensatz fahrrad2023.csv. Die folgende Abbildung zeigt für jeden Tag des Jahres die Anzahl der Fahrräder, die zwischen 17 Uhr und 18 Uhr stadtauswärts gefahren sind.

rad %>%
    filter(stunde==17) %>%
    ggplot(aes(x=tagimjahr, y=raus)) +
        geom_line() 

Um grafisch zu untersuchen, ob die Sommerferien einen Einfluss auf die Zahl der Fahrräder haben, werden zwei senkrechte rote Linien in die Abbildung eingefügt, die den Start und das Ende der Sommerferien markieren. Die Sommerferien starten am Tag 173 (der Variable tagimjahr) und enden am Tag 218. Zusätzliche Elemente werden oft als eigene geoms ergänzt. Senkrechte Linien sind geom_vline (vertical line). Das Argument xintercept legt fest, an welcher Stelle die Linie gezeichnet werden soll.

rad %>%
    filter(stunde==17) %>%
    ggplot(aes(x=tagimjahr, y=raus)) +
        geom_line() +
        geom_vline(xintercept=173,colour="red")+
        geom_vline(xintercept=218,colour="red")

Nach dem groben Augenschein scheint der Einfluss der Sommerferien auf die Zahl der Fahrräder in der ersten Hälfte der Ferien eher mäßig zu sein, danach wirken sich die Ferien stärker aus und man erkennt einen Rückgang (wobei dieser Rückgang natürlich auch auf andere Faktoren zurückführbar sein könnte). Horizontale Linien lassen sich auf ähnliche Weise mit geom_hline hinzufügen. Die Höhe wird dann durch das Argument yintercept festgelegt.

Beispiel: Text

Eine weitere Möglichkeit, zusätzliche Elemente in eine Grafik einzubinden, sind sogenannte Annotationen. Die wichtigste Annotation ist Text. Wir möchten in der vorhergehenden Grafik den Text “Sommerferien” ergänzen. Er wird wie folgt in die Abbildung eingefügt.

rad %>%
    filter(stunde==17) %>%
    ggplot(aes(x=tagimjahr, y=raus)) +
        geom_line() +
        geom_vline(xintercept=173,colour="red")+
        geom_vline(xintercept=218,colour="red")+
        annotate("text",x=195,y=930,label="Sommerferien")

Das erste Argument der Funktion annotate gibt an, dass Text in die Grafik eingefügt werden soll. Die beiden folgenden Argument legen die Koordinaten fest, an denen der Text stehen soll. Das vierte Argument ist der Text, der erscheinen soll.

Wer sich allgemein für Grafiken interessiert, kann sich einen umfassenden Überblick über alle möglichen Arten von grafischen Darstellungen mit R verschaffen auf den Seiten der R Graph Gallery. Was dort gezeigt wird, ist für diesen Kurs zum größten Teil nicht relevant. In diesem Kurs behandeln wir ausschließlich elementare Grafiken.