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()
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()
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 mitscale_x_continuous()angepasst. - Ist die
y-Achse eine numerische Variable, wird sie mitscale_y_continuous()angepasst. - Ist die
x-Achse eine kategoriale Variable, wird sie mitscale_x_discrete()angepasst. - Ist die
y-Achse eine kategoriale Variable, wird sie mitscale_y_discrete()angepasst. - Ist
coloreine kategoriale Variable, wird sie mitscale_color_continuous()angepasst. - Ist
coloreine kategoriale Variable, wird sie mitscale_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)
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))
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))
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"))
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"))
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")
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")
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())
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))
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")
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)
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()
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")
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")

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