Ästhetisches Mapping

Mit dem Laden von tidyverse haben Sie auch Zugriff auf einen Data Frame namens mpg erhalten, eine Abkürzung für miles per gallon. Er enthält Daten zum Kraftstoffverbrauch von Autos und eignet sich gut für die folgenden Übungen. Die Daten wurden von der US EPA (Environmental Protection Agency) erhoben und umfassen 38 verschiedene Automodelle (https://fueleconomy.gov/).

Falls tidyverse noch nicht installiert ist, installieren Sie es mit folgendem Befehl:

install.packages("tidyverse")

tidyverse laden:

library(tidyverse)

Die ersten Zeilen der Daten anzeigen:

mpg
manufacturer model displ year cyl trans drv cty hwy fl
audi a4 1.8 1999 4 auto(l5) f 18 29 p
audi a4 1.8 1999 4 manual(m5) f 21 29 p
audi a4 2.0 2008 4 manual(m6) f 20 31 p
audi a4 2.0 2008 4 auto(av) f 21 30 p
audi a4 2.8 1999 6 auto(l5) f 16 26 p
audi a4 2.8 1999 6 manual(m5) f 18 26 p
audi a4 3.1 2008 6 auto(av) f 18 27 p
audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 p
audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 p
audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28 p

Die ersten Zeilen von mpg.

Der Datensatz mpg

Der Datensatz mpg enthält 234 Zeilen und die folgenden 11 Variablen:

  • manufacturer: manufacturer name
  • model: model name
  • displ: engine displacement, in litres
  • year: year of manufacture
  • cyl: number of cylinders
  • trans: type of transmission
  • drv: the type of drive train, where f = front-wheel drive, r = rear wheel drive, 4 = 4wd
  • cty: city miles per gallon
  • hwy: highway miles per gallon
  • fl: fuel type
  • class: "type" of car

Damit der Code in den folgenden Übungen kurz bleibt, legen wir Beschriftungen mit labs() erst fest, wenn die Grafik fertig ist. Im folgenden Beispiel erstellen wir eine Grafik mit ggplot(). In ggplot() geben wir an, dass die Daten aus mpg stammen, und mit aes() ordnen wir displ der x-Achse und hwy der y-Achse zu. Anschließend fügen wir geom_point() hinzu, das die Werte von x und y als Punkte darstellt. In geom_point() müssen wir kein ästhetisches Mapping (aes()) angeben, da es automatisch von ggplot() vererbt wird.

ggplot(data = mpg, aes(x = displ, y = hwy)) +
  geom_point()
Streudiagramm der mpg-Daten mit dem Hubraum (displ) auf der x-Achse und der Kraftstoffeffizienz (hwy) auf der y-Achse, schwarze Punkte

Sie haben gerade die Stärke von ggplot() kennengelernt: die Fähigkeit, eine Grafik aus Ebenen aufzubauen. Die obige Grafik hat nur eine einzige Ebene, nämlich geom_point().

Ästhetisches Mapping (aesthetic mapping)

Wenn wir eine Grafik aus Ebenen aufbauen, können wir steuern, welche Daten in jeder Ebene angezeigt werden. In der nächsten Grafik erstellen wir getrennte Punkte für Autos, die mehr bzw. weniger als den Mittelwert des Kraftstoffverbrauchs (hwy) verbrauchen. Beachten Sie, dass wir aes() nicht in ggplot() angeben, sondern in jedem einzelnen geom_point().

## Mittelwert des Kraftstoffverbrauchs (hwy) berechnen
median_hwy <- median(mpg$hwy)

## Grafik erstellen
ggplot() +
  # Autos, die mehr als den Medianwert oder genau den Medianwert verbrauchen
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Autos, die weniger als den Medianwert verbrauchen
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2)
Streudiagramm von displ gegen hwy, in dem Autos mit hwy über oder auf dem Median gelb und Autos unter dem Median blaugrün dargestellt sind

Anschließend fügen wir eine horizontale Linie hinzu, die zeigt, wo der Mittelwert auf der y-Achse liegt. Dies geschieht mit geom_hline() in Zeile 16.

## Mittelwert des Kraftstoffverbrauchs (hwy) berechnen
median_hwy <- median(mpg$hwy)

## Grafik erstellen
ggplot() +
  # Für Autos, die mehr als den Medianwert oder genau den Medianwert verbrauchen
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Für Autos, die weniger als den Medianwert verbrauchen
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy)
Dasselbe Streudiagramm mit gelben und blaugrünen Punkten sowie einer schwarzen horizontalen Linie beim Median hwy 24

Als Nächstes fügen wir (mit geom_label()) einen Text hinzu, der den Medianwert auf der horizontalen Linie anzeigt. Der Text soll ganz links auf der x-Achse und beim Medianwert auf der y-Achse stehen. Die Funktion geom_label() besitzt das Argument label, das den in der Grafik anzuzeigenden Text enthält; in diesem Fall ist das schlicht der Medianwert (Zeile 17). Beachten Sie unten, dass wir „ganz links“ auf der x-Achse mit x=-Inf (negative infinity) angeben. Möchten wir etwas ganz rechts auf der x-Achse platzieren, geben wir stattdessen x=Inf an. So müssen wir den kleinsten und größten Wert der x-Achse nicht selbst ermitteln.

## Mittelwert des Kraftstoffverbrauchs (hwy) berechnen
median_hwy <- median(mpg$hwy)

## Grafik erstellen
ggplot() +
  # Für Autos, die mehr als den Medianwert oder genau den Medianwert verbrauchen
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Für Autos, die weniger als den Medianwert verbrauchen
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy) +
  geom_label(aes(x=-Inf, y=median_hwy), label=median_hwy)
Streudiagramm mit Medianlinie, bei dem die Beschriftung mit dem Medianwert teilweise über den linken Rand der Grafik hinausragt

Horizontale und vertikale Ausrichtung (hjust, vjust)

Leider liegt ein Teil der Beschriftung außerhalb der Grafik, wie die obige Abbildung zeigt. Glücklicherweise verfügen die meisten geom() auch über die Argumente hjust und vjust, mit denen sich ein Element (z. B. ein Datenpunkt oder eine Beschriftung) horizontal oder vertikal verschieben lässt. Anfangs ist es etwas schwierig zu verstehen, wie hjust und vjust Elemente verschieben, doch der folgende Spickzettel hilft sehr:

Spickzettel, der zeigt, wie sich die Position eines Textes relativ zu einem Punkt mit hjust und vjust 0, 0,5 und 1 verändert

Daraus geht hervor, dass hjust=0 und vjust=0.5 die Beschriftung auf der x-Achse nach rechts verschieben sollten. Probieren wir es aus (Zeile 17):

## Mittelwert des Kraftstoffverbrauchs (hwy) berechnen
median_hwy <- median(mpg$hwy)

## Grafik erstellen
ggplot() +
  # Für Autos, die mehr als den Medianwert oder genau den Medianwert verbrauchen
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Für Autos, die weniger als den Medianwert verbrauchen
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy) +
  geom_label(aes(x=-Inf, y=median_hwy), label=median_hwy, hjust=0, vjust=0.5)
Streudiagramm mit Medianlinie, bei dem die Beschriftung 24 nun vollständig innerhalb der Grafik am linken Rand erscheint

Der Code wird nun so angepasst, dass das ästhetische Mapping (aes()) in ggplot() erfolgt. In mpg gibt es die Spalte class, die angibt, um welchen Fahrzeugtyp es sich handelt. Wir möchten class verwenden, um die Datenpunkte einzufärben. Dazu geben wir in aes() color=class an. Ziel ist es zu untersuchen, ob ein Zusammenhang zwischen der Fahrzeugklasse und dem Kraftstoffverbrauch (mwy) besteht.

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class)) +
  geom_point()

## Sie können "color" oder "colour" schreiben, beide Varianten werden akzeptiert
Streudiagramm von displ gegen hwy, in dem die Punkte nach Fahrzeugklasse (class) eingefärbt sind, mit Legende rechts

Das ästhetische Mapping in aes() wirkt sich also auf alle Datenpunkte aus. Im obigen Beispiel haben wir festgelegt, dass die Datenpunkte für jede Ausprägung der Spalte class eine eigene Farbe erhalten. Die Bedeutung der Farben ist rechts neben der Abbildung angegeben. Beachten Sie, dass die Legende rechts die Überschrift „class“ trägt, also die Spalte, die in color angegeben wurde.

Wir verändern die Grafik weiter, indem wir zusätzliche Informationen hinzufügen. Nun soll die Größe jedes Datenpunkts eine Funktion der Anzahl der Zylinder im Motor sein. Dazu ordnen wir die Variable cyl dem Parameter size in aes() zu:

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     size=cyl)) +
  geom_point()
Streudiagramm von displ gegen hwy mit Farbe nach Fahrzeugklasse und Punktgröße nach Anzahl der Zylinder (cyl)

Offenbar besteht ein starker Zusammenhang zwischen der Anzahl der Zylinder und der Motorgröße (displ) sowie dem Kraftstoffverbrauch (hwy). Autos mit niedrigem Kraftstoffverbrauch haben einen kleinen Motor (displ) und weniger Zylinder (cyl). Beachten Sie auch, dass rechts neben der Grafik eine Größenskala mit der Überschrift cyl erscheint, also der Variablen, die wir in aes() size zugeordnet haben. In diesem Fall lässt sich cyl problemlos size zuordnen, da cyl eine numerische Variable ist, die sich in eine Rangfolge bringen lässt.

Shape (Form) und alpha (Transparenz, transparency)

In aes() lassen sich auch alpha, das die Transparenz der Punkte steuert, und shape, das die Form der Punkte steuert, angeben. Sie können einen festen Wert für alpha (z. B. alpha=0.5 für 50 % Transparenz) und shape (z. B. shape=2, um Dreiecke statt Punkte zu verwenden) angeben. Alternativ ordnen Sie alpha und shape eine Spalte zu, woraufhin ggplot() die Zuordnung automatisch vornimmt. Wir probieren nun, cyl alpha zuzuordnen:

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     size=cyl,
                     alpha=cyl)) +
  geom_point()
Streudiagramm mit Farbe nach Fahrzeugklasse, bei dem sowohl Größe als auch Transparenz von der Anzahl der Zylinder bestimmt werden

Beachten Sie oben, dass cyl nun sowohl die Größe als auch die Transparenz der Punkte bestimmt; dies geht auch aus der Legende rechts neben der Grafik hervor. Wir probieren nun, shape cyl zuzuordnen:

Wir probieren nun, class shape zuzuordnen. Außerdem passen wir die Größe der Punkte mit size=3 an, wie folgt:

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     shape=class)) +
  geom_point(size=3)
Streudiagramm, in dem die Fahrzeugklasse sowohl Farbe als auch Form bestimmt; die Klasse suv hat kein Symbol, da nur sechs Formen verwendet werden

Sie können alle Punkte mit einer bestimmten shape (Form) darstellen. Dazu geben Sie shape manuell in geom_point() an. Dies gehört nicht in aes(), sondern ist ein Argument von geom_point(), wie im folgenden Beispiel, in dem alle Punkte shape=2 erhalten, also Dreiecke:

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class)) +
  geom_point(size=3, shape=2)
Streudiagramm, in dem alle Punkte ungefüllte Dreiecke (shape 2) sind, eingefärbt nach Fahrzeugklasse

Sie können shape, color und size festlegen, indem Sie diese Eigenschaften Variablen in Ihrem Data Frame zuordnen oder bestimmte Werte angeben. Für shape, color und size gilt Folgendes:

Eigenschaft Funktion Kann über eine Variable festgelegt werden Kann manuell festgelegt werden
shape Ändert die Form von geom_point(). Ja. Weist jeder Ausprägung (maximal 6 verschiedene) eine eigene Form zu. Beispiel: shape=class Ja. Beispiel: shape=2
size Ändert die Größe von geom_point(). Angabe in Millimetern (mm). Nein. Ja, mit einem numerischen Wert.
color Ändert die Farbe von geom_point(). Ja. Beispiel: shape=class Ja, mit einer Zeichenkette oder einem HEX-Code. Beispiel Zeichenkette: color="blue" Beispiel HEX: color="#33333"

Was shape betrifft, zeigt der folgende Spickzettel die Formen und die jeweils zugehörige Nummer.

Spickzettel der Punktformen in R mit den Nummern 0 bis 24, darunter Quadrat, Kreis, Dreieck, Raute und Kreuz