Themes (Designvorlagen)

Zur Anpassung von Theme und Layout gibt es die Funktion theme(), die eine lange Reihe von Argumenten bietet, mit denen sich praktisch alle Aspekte von Layout und Theme beeinflussen lassen. Darüber hinaus gibt es fertige Themes, beispielsweise theme_bw(), die der Grafik einen bestimmten Stil verleihen. Wer ein fertiges Theme verwendet (zum Beispiel theme_bw()), muss in der Regel weniger Anpassungen manuell vornehmen.

Für die explorative Datenanalyse ist es nicht notwendig, das Theme anzupassen. Für die Präsentation sollte dies jedoch geschehen, um das Endergebnis zu optimieren. Die meisten Anwender arbeiten mit einigen wenigen Arten von Visualisierungen, weshalb es sich lohnt, Zeit in die Entwicklung passender Themes zu investieren.

In diesem Kapitel arbeiten wir mit Daten aus gapminder, die im gleichnamigen Package enthalten sind. Laden Sie gapminder mit folgendem Code:

library(gapminder)

## Die ersten 5 Zeilen inspizieren
head(gapminder)
country <fctr> continent <fctr> year <int> lifeExp <dbl> pop <int> gdpPercap <dbl>
Afghanistan Asia 1952 28.801 8425333 779.4453
Afghanistan Asia 1957 30.332 9240934 820.8530
Afghanistan Asia 1962 31.997 10267083 853.1007
Afghanistan Asia 1967 34.020 11537966 836.1971
Afghanistan Asia 1972 36.088 13079460 739.9811
Afghanistan Asia 1977 38.438 14880372 786.1134

Gapminder

Wir beginnen mit einer Grafik ohne jegliche Anpassung des Themes (beachten Sie, dass wir pop und lifeExp logarithmieren, damit die Grafik übersichtlicher wird):

ggplot(gapminder, aes(x=log(pop),
                      y=log(lifeExp))) +
  geom_point(aes(color = continent)) +
  geom_smooth()
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie, Standard-Theme mit grauem Hintergrund

Wir modifizieren nun dieses Theme, indem wir 8 vollständige Themes vorstellen. Um effizienten Code zu schreiben, erstellen wir deshalb ein Objekt (base_plot), das die obige Grafik enthält:

base_plot <- ggplot(gapminder, aes(x=log(pop),
                      y=log(lifeExp))) +
  geom_point(aes(color = continent)) +
  geom_smooth()

Nun fügen wir base_plot Themes hinzu. Außerdem ergänzen wir einen Titel, damit in der Grafik ersichtlich ist, welches Theme verwendet wurde (siehe unten).

base_plot +
  labs(title="Theme Background White (theme_bw)") +
  theme_bw()

base_plot +
  labs(title="Theme Classic (theme_classic)") +
  theme_classic()

base_plot +
  labs(title="Theme Minimal (theme_minimal)") +
  theme_minimal()

base_plot +
  labs(title="Theme Grey (theme_grey)") +
  theme_minimal()

base_plot +
  labs(title="Theme Linedraw (theme_linedraw)") +
  theme_linedraw()

base_plot +
  labs(title="Theme Dark (theme_dark)") +
  theme_dark()

base_plot
  labs(title="Theme Light (theme_light)") +
  theme_light()

base_plot +
  labs(title="Theme Void (theme_void)") +
  theme_void()
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie in theme_void, ohne Achsen und Gitternetz
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie in theme_light mit hellgrauem Gitternetz
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie in theme_dark mit dunkelgrauem Panel
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie in theme_linedraw mit schwarzem Rahmen und Gitternetz
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie, Titel Theme Grey mit weißem Hintergrund und hellem Gitternetz
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie in theme_minimal mit weißem Hintergrund ohne Rahmen
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie in theme_classic mit Achsenlinien ohne Gitternetz
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie in theme_bw mit weißem Hintergrund und schwarzem Rahmen

Ggthemes

Das Package ggthemes (https://jrnold.github.io/ggthemes/) enthält noch mehr vollständige themes, scales und geoms für ggplot2. In ggthemes gibt es mehr Optionen als in jedem anderen existierenden Package. Zudem gibt es Optionen, die speziell für Forschung, wissenschaftliche Publikationen, Farbenblindheit, bestimmte Fachzeitschriften, Anwendungen usw. entwickelt wurden. Installieren Sie das Package mit folgendem Befehl:

install.packages("ggthemes")
library(ggthemes)

Wir probieren ein fertiges Theme aus, das dem Wall Street Journal nachempfunden ist:

base_plot +
  labs(title="Theme Wall Street Journal") +
  theme_wsj()
Streudiagramm der gapminder-Daten in theme_wsj aus ggthemes mit beigem Hintergrund, gepunkteten Linien und Legende oben

Bestimmte Elemente anpassen

Bei allen obigen Beispielen handelte es sich um fertige Themes, die viele Elemente gleichzeitig verändern. Mit theme() können Sie praktisch sämtliche Elemente des Themes modifizieren. Diese Funktion nimmt eine große Zahl von Elementen entgegen, die Elementfunktionen besitzen. Beispielsweise wird das Element title verwendet, um alle Titel anzupassen. Da Titel Text sind, haben sie die Elementfunktion element_text(). In element_text() können wir zum Beispiel Größe und Farbe der Titel mit folgendem Code ändern:

title = element_text(size=12, color="purple")

In der Grafik sieht das folgendermaßen aus:

base_plot +
theme(title = element_text(size=15, color="gold1"))
Streudiagramm von log(lifeExp) gegen log(pop), nach Kontinent eingefärbt, mit Regressionslinie, bei dem Achsentitel und Legendentitel gelb und größer sind
Es folgt eine Liste der Elemente in theme(), gefolgt von einer Abbildung, die die gebräuchlichsten Elemente und ihre Elementfunktionen zeigt.
theme(
  line,
  rect,
  text,
  title,
  aspect.ratio,
  axis.title,
  axis.title.x,
  axis.title.x.top,
  axis.title.x.bottom,
  axis.title.y,
  axis.title.y.left,
  axis.title.y.right,
  axis.text,
  axis.text.x,
  axis.text.x.top,
  axis.text.x.bottom,
  axis.text.y,
  axis.text.y.left,
  axis.text.y.right,
  axis.ticks,
  axis.ticks.x,
  axis.ticks.x.top,
  axis.ticks.x.bottom,
  axis.ticks.y,
  axis.ticks.y.left,
  axis.ticks.y.right,
  axis.ticks.length,
  axis.ticks.length.x,
  axis.ticks.length.x.top,
  axis.ticks.length.x.bottom,
  axis.ticks.length.y,
  axis.ticks.length.y.left,
  axis.ticks.length.y.right,
  axis.line,
  axis.line.x,
  axis.line.x.top,
  axis.line.x.bottom,
  axis.line.y,
  axis.line.y.left,
  axis.line.y.right,
  legend.background,
  legend.margin,
  legend.spacing,
  legend.spacing.x,
  legend.spacing.y,
  legend.key,
  legend.key.size,
  legend.key.height,
  legend.key.width,
  legend.text,
  legend.text.align,
  legend.title,
  legend.title.align,
  legend.position,
  legend.direction,
  legend.justification,
  legend.box,
  legend.box.just,
  legend.box.margin,
  legend.box.background,
  legend.box.spacing,
  panel.background,
  panel.border,
  panel.spacing,
  panel.spacing.x,
  panel.spacing.y,
  panel.grid,
  panel.grid.major,
  panel.grid.minor,
  panel.grid.major.x,
  panel.grid.major.y,
  panel.grid.minor.x,
  panel.grid.minor.y,
  panel.ontop,
  plot.background,
  plot.title,
  plot.title.position,
  plot.subtitle,
  plot.caption,
  plot.caption.position,
  plot.tag,
  plot.tag.position,
  plot.margin,
  strip.background,
  strip.background.x,
  strip.background.y,
  strip.clip,
  strip.placement,
  strip.text,
  strip.text.x,
  strip.text.y,
  strip.switch.pad.grid,
  strip.switch.pad.wrap,
)

Elementfunktionen:

Übersicht über die Theme-Elemente in ggplot2 mit Pfeilen zu Achsen-, Plot-, Facetten- und Legendenelementen und ihren Elementfunktionen

Im Folgenden erstellen wir eine Abbildung mit Beschriftungen (labs()) für x, y und titel, neuen Skalen für x und y sowie der Anpassung einiger theme()-Elemente.

base_plot +
  # Ändert die Beschriftungen von x, y und Titel
  labs(x="Population",
       y="Life expectancy (years)",
       title="Life expectancy and population size") +

  # Ändert die Skala der x-Achse und der y-Achse
  scale_y_continuous(breaks=seq(3, 5, by=0.5),
                     limits=c(2, 5)) +
  scale_x_continuous(breaks=seq(10, 20, by=1),
                     limits=c(10, 20)) +

  # Passt das Theme an
  theme(legend.text = element_text(color="brown4"),
        legend.title = element_blank(),
        legend.key = element_blank(),
        panel.grid.major.x=element_line(color = "lightgoldenrod3",
                                        size = 0.5,
                                        linetype = 2),
        panel.grid.minor.x=element_line(color = "palevioletred3",
                                        size = 0.5,
                                        linetype = 2),
        plot.background = element_rect(fill="wheat3"))
Streudiagramm der Lebenserwartung gegen die Bevölkerungsgröße mit beigem Hintergrund, gestricheltem Gitternetz in zwei Farben und braunen Legendentexten