Scales, Achsen, Legenden (Guides)

In ggplot2 gibt es automatische Funktionen, die die Skalen für die x-Achse, die y-Achse, color, fill und die Legenden (engl. figure legends) optimieren. Durch Anpassen der Skalen können wir das Aussehen der x-Achse und der y-Achse verändern. Skalen werden außerdem verwendet, um den Inhalt von Legenden zu verändern. Mit Skalen lassen sich also sowohl Achsen als auch Legenden modifizieren. Achsen und Legenden zusammen bezeichnet man als die Guides der Abbildung.

In diesem Kapitel verwenden wir Daten aus der Erhebung mpg. Stellen Sie sicher, dass tidyverse geladen ist; dadurch werden auch ggplot2 und mpg verfügbar:

library(tidyverse)

## Die ersten 5 Zeilen von mpg ansehen
head(mpg)
manufacturer <chr> model <chr> displ <dbl> year <int> cyl <int> trans <chr> drv <chr> cty <int> hwy <int> fl <chr>
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

mpg-Daten.

Im folgenden Beispiel wird eine Grafik mit x-Achse, y-Achse und Farbkodierung (color) auf Grundlage der Spalte class erstellt:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point()
Streudiagramm von Hubraum (displ) gegen Kraftstoffverbrauch auf der Autobahn (hwy) in mpg, eingefärbt nach Fahrzeugklasse (class)

Aus der obigen Grafik geht hervor, dass ggplot() automatisch eine Skala für die x-Achse, die y-Achse und eine Skala für die Farben der Datenpunkte erstellt hat. Das erledigt ggplot() mit den Funktionen scale_x_continuous(), scale_y_continuous() und scale_colour_discrete(). Wir müssen diese Funktionen im obigen Code nicht angeben, weil ggplot() dies automatisch tut. Fügen wir diese Funktionen hinzu, erhalten wir eine identische Grafik:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous() +
  scale_y_continuous() +
  scale_colour_discrete()
Dasselbe Streudiagramm von displ gegen hwy, eingefärbt nach Fahrzeugklasse, gezeichnet mit explizit angegebenen Standardskalen

Diese Funktionen und ihre Namen sind wie folgt zu verstehen:

Funktion Erläuterung
scale_x_continuous() Modifiziert eine stetige (numerische) x-Achse. Im obigen Beispiel wird die Skala für displ modifiziert.
scale_x_continuous() Modifiziert eine stetige (numerische) y-Achse. Im obigen Beispiel wird die Skala für hwy modifiziert.
scale_colour_discrete Modifiziert das Argument colour (color), wenn es sich um eine diskrete Variable handelt. Im obigen Beispiel wird die Skala für class modifiziert.

Andere scale-Funktionen werden auf dieselbe Weise verwendet und folgen demselben Benennungsprinzip:

  • Ist die x-Achse eine numerische Variable, wird sie mit scale_x_continuous() angepasst.
  • Ist die y-Achse eine numerische Variable, wird sie mit scale_y_continuous() angepasst.
  • Ist die x-Achse eine kategoriale Variable, wird sie mit scale_x_discrete() angepasst.
  • Ist die y-Achse eine kategoriale Variable, wird sie mit scale_y_discrete() angepasst.
  • Ist color eine kategoriale Variable, wird sie mit scale_color_continuous() angepasst.
  • Ist color eine kategoriale Variable, wird sie mit scale_color_discrete() angepasst.

Guides: Achsen und Legenden

Die Guides der Abbildung (dt. Führungselemente) bestehen aus der Skala der Achsen (x, y) und den Legenden. Achsen und Legenden werden mit den folgenden Argumenten modifiziert:

  • breaks: legt fest, welche Zahlen auf einer Achse bzw. welche Kategorien in einer Legende angezeigt werden.
  • labels: modifiziert die Beschriftungen (Labels), die auf einer Achse oder in einer Legende angezeigt werden.
  • limits: modifiziert den Wertebereich der Achsen.

Achsen (x, y)

Wir knüpfen an die vorherige Grafik an und entfernen nun die Skala der x-Achse und der y-Achse. Dazu deklarieren wir breaks=NULL, wie folgt:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = NULL) +
  scale_y_continuous(breaks = NULL)
Streudiagramm von displ gegen hwy, bei dem Teilstriche, Skalenwerte und Gitterlinien der x- und y-Achse entfernt wurden

In der ersten Abbildung haben wir gesehen, dass die x-Achse von 2 bis 7 in Intervallen von 1,0 reicht. Wir ändern die Skala so, dass sie von 2 bis 7 in Intervallen von 0,5 reicht. Dazu erhält breaks eine Sequenz (mit der Funktion seq()) von 2 bis 7 im Abstand von 0,5, wie folgt:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(from=2, to=7, by=0.5))
Streudiagramm von displ gegen hwy, bei dem die x-Achse Unterteilungen im Abstand von 0,5 Einheiten von 2,0 bis 7,0 hat

Im nächsten Beispiel erweitern wir die Begrenzung der x-Achse auf 0 bis 15:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(from=2, to=7, by=.5),
                     limits = c(0, 10))
Streudiagramm von displ gegen hwy, bei dem die Grenzen der x-Achse erweitert sind, sodass sich die Punkte in der Mitte der Abbildung sammeln

Im nächsten Beispiel begrenzen wir die x-Achse auf das Intervall 1 bis 5 und ersetzen die Zahlen durch neue Labels, nämlich die ersten fünf Buchstaben:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1, 5, by=1),
                     limits = c(1, 5),
                     labels = c("A", "B", "C", "D", "E"))
Streudiagramm von displ gegen hwy, bei dem die Skalenwerte der x-Achse durch die Beschriftungen A bis E ersetzt wurden

Legenden (legends)

Wie oben erwähnt, wirken sich breaks und limits auch auf Legenden aus. Die Legende selbst entsteht aus dem ästhetischen Mapping. Im folgenden Beispiel wird color=class in aes() verwendet. Um diese Skala zu modifizieren, verwenden wir die Funktion scale_color_discrete(). Wir geben an, dass breaks nur "pickup" enthält und dieses das Label "Pickup car" erhält.

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_color_discrete(breaks=c("pickup"),
                       labels=c("Pickup car"))
Streudiagramm von displ gegen hwy, eingefärbt nach Fahrzeugklasse, bei dem die Legende nur eine Klasse mit der Beschriftung Pickup car zeigt

Auf diese Weise lässt sich auch die Reihenfolge in der Legende anpassen.

Position der Legende (figure legends)

Die Platzierung der Legende beeinflusst nicht die Daten, die in der Grafik dargestellt werden. Solche Komponenten werden mit theme() angepasst. Die Legende kann an beliebiger Stelle in der Abbildung positioniert werden. Im Folgenden finden Sie mehrere Beispiele, in denen die Position der Legende angepasst wird.

Im ersten Beispiel entfernen wir die Legende mit dem Argument legend.position = "none".

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(legend.position = "none")
Streudiagramm von displ gegen hwy, eingefärbt nach Fahrzeugklasse, bei dem die Legende vollständig entfernt wurde

Das Argument legend.position akzeptiert außerdem die Angaben "bottom", "top", "right", "left". Dies zeigen wir nun am Beispiel von "bottom":

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(legend.position = "bottom")
Streudiagramm von displ gegen hwy, eingefärbt nach Fahrzeugklasse, mit der Legende unterhalb des Diagramms in zwei Zeilen

Weitere mögliche Platzierungen mit Textstrings sind:

  • theme(legend.position = "top")
  • theme(legend.position = "bottom")
  • theme(legend.position = "left")
  • theme(legend.position = "right")

Sie können Legenden auch mit Koordinaten positionieren, wobei sowohl die x- als auch die y-Achse von 0 bis 1 reicht. Um die Legende ganz unten rechts zu positionieren, lauten die Koordinaten x=1 und y=0, was in einem numerischen Vektor (c(1, 1)) angegeben wird.

Sie können Legenden auch mit Koordinaten positionieren, wobei sowohl die x- als auch die y-Achse von 0 bis 1 reicht. Um die Legende ganz oben rechts zu positionieren, lauten die Koordinaten x=1 und y=1, was in einem numerischen Vektor (c(1, 1)) angegeben wird. In theme() gibt es für die Legende weitere Argumente (legend.justification, legend.margin usw.), die wir im Folgenden ebenfalls verwenden, um die Lage der Legende zu optimieren. Im Code stehen Kommentare, die erklären, was jedes Argument bewirkt.

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(
    # Legende wird ganz oben rechts positioniert
    legend.position = c(1, 1),

    # Legende darf nicht über die Begrenzung der Grafik hinausragen
    legend.justification = c("right", "top"),

    # Margin erzeugt einen Rand zwischen der Legende und ihrer Umgebung.
    # 10 mm Margin an allen 4 Kanten
    legend.margin = margin(10, 10, 10, 10),

    # Der Hintergrund wird entfernt, indem er als leeres Element angegeben wird
    legend.background = element_blank())
Streudiagramm von displ gegen hwy mit der Legende innerhalb der oberen rechten Ecke des Diagramms
Mit guides() lassen sich einzelne Legenden einer Abbildung anpassen. Passen wir die Lage und das Aussehen der Legenden für die Fahrzeughersteller (manufacturer) oben an. Dazu ändern wir die Anzahl der Zeilen (nrow), in denen die Legenden dargestellt werden, sowie die Größe (size) der Symbole in den Legenden.
ggplot(mpg, aes(x=displ,
                y=hwy,
                color=manufacturer,
                shape=drv)) +
  geom_point(size=3) +

  # Legenden oberhalb der Grafik platzieren
  theme(legend.position = "top") +

  # Ändert einzelne Legenden
  guides(colour = guide_legend(nrow = 3, #Anzahl der Zeilen
                               override.aes = list(size = 4), # Größe der Legendensymbole
                               order = 2), # die Reihenfolge
         shape = guide_legend(nrow = 3,
                              override.aes = list(size = 4),
                              order = 1))
Streudiagramm von displ gegen hwy mit Farbe nach Hersteller und Form nach Antriebsart, Legenden oberhalb in drei Zeilen

Wir können guides() verwenden, um eine einzelne Legende auszublenden. Im Folgenden blenden wir die Legende für shapes aus und ändern das Label der Legende für color in "Biltillverkare".

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=manufacturer,
                shape=drv)) +
  geom_point() +
  theme(legend.position = "top") +
  guides(colour = guide_legend(title="Biltillverkare",
                               nrow = 3,
                               override.aes = list(size = 5)),
         # Legende für shape ausblenden
         shape = "none")
Streudiagramm von displ gegen hwy, bei dem nur die Legende für die Hersteller angezeigt wird, mit dem Titel Biltillverkare und größeren Symbolen

Eine Skala ersetzen oder transformieren

Eine numerische Skala kann transformiert werden, um Zusammenhänge in den Daten deutlicher sichtbar zu machen. Im nächsten Beispiel verwenden wir Daten aus gapminder, um zu visualisieren, wie Bevölkerungsgröße (pop) und Lebenserwartung (lifeExp) korrelieren. Wir tun dies mit und ohne Logarithmierung der Achsen. Um die Abbildungen nebeneinander zu platzieren, weisen wir die ggplot()-Objekte zwei neuen Objekten (plot_1, plot_2) zu, die wir anschließend in plot_grid() aus dem Package cowplot verwenden.

library(gapminder)

## Ohne Logarithmus
plot_1 <- ggplot(gapminder, aes(x=pop,
                                y=lifeExp,
                                color=year)) +
  geom_point() +
  labs(title="Utan logaritmerade axlar") +
  theme(legend.position = "bottom")

## Mit Logarithmus
plot_2 <- ggplot(gapminder, aes(x=pop,
                                y=lifeExp,
                                color=year)) +
  geom_point() +
  scale_x_log10() +
  scale_y_log10() +
  labs(title="Med logaritmerade axlar") +
  theme(legend.position = "bottom")

library(cowplot)
plot_grid(plot_1, plot_2)
Zwei Streudiagramme von Bevölkerung gegen Lebenserwartung in gapminder, ohne bzw. mit logarithmierten Achsen

Farbskala und Farbpalette ändern

R Colorbrewer

Skalen werden auch verwendet, um diskrete Variablen einzufärben. In ggplot gibt es eingebaute Farbpaletten, deren Farben sorgfältig ausgewählt wurden. Darüber hinaus gibt es weitere Farbpaletten für speziellere Zwecke. Beispielsweise gibt es R ColorBrewer, das aus einer Reihe von Farbpaletten besteht, die sich besonders für Menschen mit Farbenblindheit eignen. Um alle Farbpaletten in R ColorBrewer anzuzeigen, geben Sie folgenden Befehl ein:

RColorBrewer::display.brewer.all()
Übersicht aller ColorBrewer-Paletten in R: sequenzielle, qualitative und divergierende Farbskalen

Sie können diese Farbpaletten in ggplot über die Funktion scale_color_brewer() verwenden. Wie aus der obigen Abbildung hervorgeht, gibt es eine Farbpalette namens "Set3". Im Folgenden verwenden wir "Set3" in scale_color_brewer().

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_color_brewer(palette = "Set1")
Streudiagramm von displ gegen hwy, bei dem die Fahrzeugklassen mit einer qualitativen ColorBrewer-Palette eingefärbt sind

Auf https://colorbrewer2.org/ können Sie mehr über ColorBrewer lesen.

Viridis

Im Package viridis gibt es scale_color_viridis() und scale_fill_viridis(), die sowohl für stetige als auch für diskrete Variablen verwendet werden können. Für stetige Variablen ist viridis gegenüber ColorBrewer vorzuziehen.

library(viridis)

## Viridis-Standardfarben
ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_color_viridis_c()

## Viridis plasma
ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_color_viridis_c(option = "plasma")
Streudiagramm von Bevölkerung gegen Lebenserwartung, bei dem die Punkte nach Jahr mit der stetigen viridis-Skala eingefärbt sind
Streudiagramm von Bevölkerung gegen Lebenserwartung, bei dem die Punkte nach Jahr mit der viridis-Palette plasma eingefärbt sind

Manuelle Farbskalen

Wenn weder die eingebauten Farbpaletten noch Paletten aus Packages wie viridis passen, können Sie die Farbpalette manuell erstellen. Dies geschieht mit scale_colour_manual() oder scale_fill_manual(). Hier folgt ein Beispiel, in dem scale_colour_manual() verwendet wird, um Fahrzeugen auf Grundlage von class manuell Farben zuzuweisen.

ggplot(gapminder, aes(x=pop,
                y=lifeExp,
                color=continent)) +
  geom_point() +
    scale_colour_manual(values = c(Africa="darkblue",
                                   Asia="pink",
                                   Europe="green",
                                   Oceania="purple",
                                   Americas="cyan"))
Streudiagramm von Bevölkerung gegen Lebenserwartung mit manuell gewählten Farben für jeden Kontinent

Mit den Funktionen scale_fill_gradient2() und scale_colour_gradient2() können stetige Variablen einen Farbverlauf mit einem Mittelpunkt erhalten. Im folgenden Beispiel wird scale_colour_gradient2() verwendet, um Datenpunkte nach dem Jahr 1980 schwarz und Datenpunkte vor 1980 gelb einzufärben, jeweils mit einem Verlauf ab 1980. Beachten Sie, dass auch die Achsen logarithmiert sind.

ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_colour_gradient2(midpoint=1980,
                         high = "black",
                         low = "gold") +
  scale_x_log10() +
  scale_y_log10()
Streudiagramm von Bevölkerung (logarithmiert) gegen Lebenserwartung mit einem dreistufigen Farbverlauf nach Jahr, von Gelb über Weiß bis Schwarz