Letzte Änderung am 15. November 2025 um 20:32:58

“Frei ist, wer missfallen kann.” — Annette Oschmann in Mädchen stärken

Willkommen in einer weiteren wilden Linksammlung und R Code sowie einiges an interessanten R Paketen im Kontext der Visualisierung von Daten. Hier dreht sich dann fast alles um das R Paket {ggplot} und wie wir dieses R Paket sinnvoll nutzen können. Daher ist alles hier sehr stückhaft und manchmal einfach nur da. Das hat den Grund, dass ich das Kapitel hier eher als Steinbruch nutze als ein echtes Kapitel zum von oben nach unten Lesen. Sehe das Kapitel also eher als Referenzsammlung als ein Lernkapitel. Es lädt dann zum Stöbern ein. Es sind also eher kleine Rezepte in einem Kochbuch. Am Ende kommst du vermutlich aber nicht um Wickham & Grolemund (2016) und R for Data Science (2e) oder aber dem Buch ggplot2: Elegant Graphics for Data Analysis (3e) herum. Am Ende kann ich noch das R Graphics Cookbook empfehlen, wenn es um konkrete Probleme geht.

Dieses Kapitel dient dazu Programmierung in {ggplot} zu präsentieren. Es ist eine Sammlung von Code und Rezepten, die ich immer mal wieder nutze und immer wieder vergesse. Deshalb hat dieses Kapitel auch den Titel Cookbook. Wenn dich also Rumfummeln in {ggplot} interessiert, dann kannst du dir hier noch was anschauen. Das Kapitel ist eigentlich nie fertig, da ich sicherlich immer mal wieder was ergänzen werde.

15.1 Allgemeiner Hintergrund

In diesem Kapitel geht es hauptsächlich um das R Paket {ggplot}. Korrekterweise müsste ich natürlich eigentlich noch die korrekte Version ergänzen, aber wir schreiben selten {ggplot2} da eigentlich niemand mehr die uralte Version nutzt. Warum dieses Kapitel? Weil es eben dann doch so viel zu entdecken gibt, dass ich mir nicht alles merken kann. Daher habe ich einmal hier die Sammlung an nützlichen R Paketen um {ggplot} erstellt. Darüber hinaus war dann auch das Kapitel zur Visualisierung einfach zu voll. Viele wollen dann einfach einen {ggplot} erstellen und nicht noch durch zig Pakete scrollen. Daher ist das hier eher für mich oder für Leute, die mal rechts und links gucken wollen was da noch am Straßenrand liegt. Vielleicht findest du was, was dich inspiriert. Daher auch die Einteilung in Abschnitte, wo ich ein Problem löse und dann nochmal Abschnitte mit teilweise den gleichen R Paketen als Vorstellung.

TippWoher habe ich alle Pakete her?

Wenn es einen Link zu einer Seite gibt, den ich immer mal wieder Besuche, ist es der folgende Link: ggplot2 extensions. Du erfährst hier eine Menge neues an Paketen und es gibt immer wieder spannendes zu entdecken. Ein Besuch lohnt sich auf jeden Fall.

15.2 Genutzte R Pakete

Wir wollen folgende R Pakete in diesem Kapitel nutzen.

R Code [zeigen / verbergen]
pacman::p_load(tidyverse, readxl, latex2exp, see, duke, 
               wesanderson, ggbreak, patchwork, ggrepel,
               tidyplots, ggh4x, ggtext, gganimate, 
               ggpmisc, broom, ggdist, distributional, conflicted)
conflicts_prefer(ggplot2::annotate)

An der Seite des Kapitels findest du den Link Quellcode anzeigen, über den du Zugang zum gesamten R-Code dieses Kapitels erhältst.

15.3 Daten

Beginnen wir hier nochmal mit einem Datenbeispiel für unsere Flöhe. Wir schauen uns hier einmal an, ob es einen Unterschied in den Ernährungsformen sowie dem Entwicklungsstand gibt. Dabei messen wir dann wieder die Sprungweite. Darüber hinaus nehme ich noch das Gewicht der Flöhe mit in unseren Datensatz. Damit haben wir auch schon genug um mal etwas hier mit {ggplot} spielen zu können. Ob hier irgendwas interessantes in den Daten vorliegt interessiert uns eigentlich ja nicht. Hier geht es ums visualisieren.

R Code [zeigen / verbergen]
ggplot_tbl <- read_xlsx("data/fleas_model_data.xlsx") |> 
  mutate(feeding = as_factor(feeding),
         stage = as_factor(stage)) |> 
  select(feeding, stage, weight, jump_length)

Betrachten wir als erstes einen Auszug aus der Datentabelle. Wir werden hier immer den Messwert auf die y-Achse legen und uns dann je nach Anwendung sowie Algorithmus für eine Einflussvariable entscheiden.

Tabelle 15.1— Tabelle der vier Variablen für die Darstellung mit {ggplot}. Der Messwert ist hier die Sprungweite. Die anderen Variablen dienen als Einflussvariablen.
feeding stage weight jump_length
sugar_water adult 16.42 77.2
sugar_water adult 12.62 56.25
sugar_water adult 15.57 73.42
ketchup juvenile 7.18 83.38
ketchup juvenile 6.6 104.48
ketchup juvenile 4.19 130.18

Bitte den Datensatz hier nicht allzu überinterpretieren. Ich brauche einfach nur ein paar Daten um die Funktionen aufrufen zu können. Da ich aber nicht die generischen Daten nutzen will, mache ich hier alles mit meinen Flöhen. Das sind ja meine Tiere hier in der Bio Data Science und deshalb nehmen wir das hier mal auch als Beispiel.

15.4 Probleme von Interesse

Im Folgenden dann noch eine Sammlung an nützlichen Optionen und Möglichkeiten, die einem das Leben einfacher machen und die Abbildungen dann noch schöner. Nicht alles musst du in {ggplot} machen, manchmal geht es dann in PowerPoint dann doch schneller mal eben einen Text zu ergänzen. Sehe das hier deshalb als Ergänzung und meinen privaten Raum, den ich nutze um mir den Code zu merken. Viele der Probleme sind dann auch eher so Sachen, die du mit der Zeit als erstrebenswert empfinden magst.

15.4.1 Striche, Punkte und Text

Der folgende Code und die entsprechenden Abbildungen sind einfach nur Copy& Paste von der Vignette Aesthetic specifications in {ggplot} und dienen nur meinem schnellen Zugriff. Dann habe ich hier alles was ich brauche einmal zusammen. Häufig sucht man dann doch nochmal die Form eines Punktes oder die Art der Linie.

Abbildung 15.2— Verschiedene Formen der Punkte die durch die shape-Option geändert werden können. Teilweise lassen sich die Punkte auch mit der Option fill entsprechebd einfärben. [Zum Vergrößern anklicken]

Dann gibt es noch die Möglichkeit sich verschiedene Arten von Linien zeichnen zu lassen. Im Folgenden dann erstmal der Standard, der dann manchmal nicht so richtig passt. Dafür gibt es dann aber gleich nochmal eine Option die Abstände zwischen den Teillinien zu ändern.

Abbildung 15.3— Verschiedene Arten der Linien die durch die linetype-Option geändert werden können. [Zum Vergrößern anklicken]

Manchmal will ich dann aber nicht so große Abstände haben. Hier können wir dann mit der Option und verschiedenen Buchstaben spielen. Mehr gibt es in der Vignette Aesthetic specifications in {ggplot} dazu. Hier reichen mir die folgenden Beispiele um mal schnell die passende Linie zu finden.

Abbildung 15.4— Verschiedene Arten der Linien die durch die linetype-Option geändert werden können. Hier können dann individuell die Abstände zwischen den Linien angepasst werden. [Zum Vergrößern anklicken]

Manchmal wollen wir dann noch den Text positionieren. Das können wir dann entweder durch die Option hjust mit den Worten "left", "center" oder "right" machen oder eben dann mit Zahlen. Das ganz geht dann neben der horizontalen Ebene auch mit vjust auf der vertikalen Ebene. Für mich ist es immer etwas Voodoo und ich schaue hier dann immer regelmäßig rein.

Abbildung 15.5— Positionen von Text durch die Optionen vjust und hjust. [Zum Vergrößern anklicken]

Natürlich geht wie immer auch mehr. Dazu dann aber mehr in der passenden Vignette oder eben auf den entsprechenden Hilfeseiten von {ggplot}. Aus meiner Erfahrung habe ich dann meistens nicht mehr gebraucht oder es mir dann situativ zusammengesucht.

15.4.2 Überschriften, Achsen und Legenden

Die Abbildungen einfach nur so machen ist eigentlich nur in einer reinen explorativen Datenanalyse sinnvoll. Sobald du die Abbildungen dann irgendwie veröffentlichen willst, dann sind die normalen Beschriftungen der Achsen in {ggplot} mit den Variablennamen nicht mehr schön. Wenn du dann mehr machen willst, also die Überschriften anpassen oder aber die Achsenbeschriftung ändern, dann gibt es hier global Hilfe im {ggplot} Manual. In den folgenden Abbildungen siehst du einmal einen veränderten Titel und Beschriftungen sowie die Legenden. Die Möglichkeiten sind nahezu unbegrenzt und sprengen auch hier den Rahmen. Die Webseite R Cookbook hat auch spezielle Hilfe für {ggplot}.

Überschriften und Achsenbeschriftung

Die Überschriften von Abbildungen können wir beliebig anpassen. Hier können wir die Funktion ggtitle() oder aber die Funktion labs() nutzen. Die Achsenbeschriftung können wir in der Funktion labs() einfach ändern. Das ist dann am Ende immer eine Geschmacksfrage was dir besser gefällt. Ich nutze hier gerne die Funktion labs(), dann habe ich alles zusammen.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  theme_minimal() +
  geom_boxplot() +
  labs(title = "Ernährungsbedinungen",
       subtitle = "Unterschiedliche Bedingungen für die Sprungweite",
       caption = "Erhoben im Sommer 2022",
       x = "Ernährungsarten", y = "Sprungweite in [cm]",
       fill = "Ernährung")
Abbildung 15.6— Beispielhafte Abbildung mit Titel und geänderter Achsenbeschrittung. [Zum Vergrößern anklicken]

Legende anpassen

Die Legende können wir ebenfalls in labs() und dann in den entsprechenden scales-Funktionen anpassen. Hier musst du im Zweifel etwas probieren. Faktoren würde ich in den Daten über die Funktion factor() anpassen. Du hast dann hier eben auch die Wahl wie du vorgehst. Manchmal macht es dann auch Sinn dir ein eigenes tibble für die Erstellung der Abbildungen zu bauen. In den beiden folgenden Tabs zeige ich dir mal beide Wege.

Wir bauen hier erstmal den Faktor mit der Funktion factor() in der wir dann die Sortierung und dann die Labels der Level ändern können. Ich empfehle dir erst die Sortierung zu bestimmen und dann umzubenennen. Sonst kann da schnell was durcheinanderkommen. Hier mag dann auch das R Paket {forcats} helfen.

R Code [zeigen / verbergen]
ggplot_factor_tbl <- ggplot_tbl |> 
  mutate(feeding = factor(feeding,
                          levels = c("sugar_water", "blood", "ketchup"),
                          labels = c("Zuckerwasser", "Blut", "Ketchup")))

Dann können wir uns auch schon einmal die folgende Abbildung bauen in dem wir die Level des Faktors geändert haben.

R Code [zeigen / verbergen]
ggplot(data = ggplot_factor_tbl, aes(x = feeding, y = jump_length,
                                     fill = feeding)) +
  theme_minimal() +
  geom_boxplot() 
Abbildung 15.7— Beispielhafte Abbildung mit Titel und geänderter Achsenbeschrittung. [Zum Vergrößern anklicken]

Es ist auch möglich direkt in {ggplot} die Level des Faktors umzubenennen. Das ist genau so gut, wenn wir hier nicht so viel mit der Sortierung ändern wollen. Wie immer würde ich hier empfehlen nur Kosmetik zu machen und den Rest sauber über das R Paket {forcats} oder eben die Funktion factor()

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  theme_minimal() +
  geom_boxplot() +
  scale_x_discrete(labels = c("Blut", "Ketchup", "Zuckerwasser")) +
  scale_fill_discrete(name = "Behandlung", 
                      labels = c("Blut", "Ketchup", "Zuckerwasser"))
Abbildung 15.8— Beispielhafte Abbildung mit Titel und geänderter Achsenbeschrittung. [Zum Vergrößern anklicken]

15.4.3 Schriftarten

Das Thema Schriftarten ist so eine Sache. Am Ende des Abschnitts gebe ich dir nochmal eine Linksammlung für die Hilfe. Es ist nämlich wichtig in welchem Betriebssystem (eng. operating system, abk. OS) du arbeitest. Je nach Betriebssystem hast du unterschiedliche Schriften installiert und die lassen sich dann nicht so einfach exportieren oder aber in anderen Betriebssystemen darstellen. Fangen wir also erstmal mit einer Abbildung an, an der wir dann mal was ändern wollen. Wir speichern die Abbildung einmal als Objekt p1 ab und ändern nachträglich die Schriftarten.

R Code [zeigen / verbergen]
p1 <- ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  theme_minimal() +
  geom_boxplot() +
  scale_x_discrete(labels = c("Blut", "Ketchup", "Zuckerwasser")) +
  labs(title = "Ernährungsbedinungen",
       subtitle = "Unterschiedliche Bedingungen für die Sprungweite",
       caption = "Erhoben im Sommer 2022",
       x = "Ernährungsarten", y = "Sprungweite in [cm]",
       fill = "Ernährung")
p1
Abbildung 15.9— Beispielhafte Abbildung mit Titel und geänderter Achsenbeschrittung in der die Schriftarten geändert werden sollen. [Zum Vergrößern anklicken]

Wenn wir allgemein die Schriftart in der ganzen Abbildung ändern wollen, dann können wir einfach folgende Option in theme() setzen. Hier ändern wir alles an Text einmal auf "Times New Roman" um. Welche Möglichkeiten du hast, hängt von deinem Betriebssystem und deinen installierten Schriften ab. Dazu mehr weiter unten.

R Code [zeigen / verbergen]
p1 +
  theme(text = element_text(family = "Times New Roman"))

Wir können auch vollkommen frei drehen und dann alles mögliche ändern. Ich habe hier mal alles verwendet was es so in meinem Schriftordner so gab. Leider ist es dann auch hier wirklich so, dass es keien direkte Übersicht an möglichen Schriften gibt.

R Code [zeigen / verbergen]
p1 +
  theme(plot.title = element_text(family = "mono"),
        plot.subtitle = element_text(family = "sans"),
        axis.title.x = element_text(family = "Comic Sans MS"),
        axis.title.y = element_text(family = "AppleGothic"),
        axis.text.x = element_text(family = "Optima"),
        axis.text.y = element_text(family = "Luminari"))

Am Ende gibt es noch die Möglichkeit eine mono, sans oder serif Schriftfamilie auszuwählen. Dann wird die Standardschrift deines Betriebssystems genommen. Das mag sich dann wiederum unterscheiden, aber dafür hat dann die Schrift die Eigenschaften, die du möchtest.

Mit der Option "mono" erhälst du eine nichtproportionale Schrift.

R Code [zeigen / verbergen]
p1 +
  theme(text = element_text(family = "mono"))

Mit der Option "sans" erhälst du eine serifenlose Schrift.

R Code [zeigen / verbergen]
p1 +
  theme(text = element_text(family = "sans"))

Mit der Option "serif" erhälst du eine Serifenschrift.

R Code [zeigen / verbergen]
p1 +
  theme(text = element_text(family = "serif"))

Dann möchte ich hier am Ende nochmal auf ein paar Blogs und Hilfeseiten verlinken, die sich alle mit dem Thema Schriftarten in {ggplot} beschäftigen. Vielleicht ist ja einer der Links exakt das, was du jetzt nochmal nachschauen wolltest. Es ist dann eher ein kompliziertes Thema, was dich einiges an Zeit kosten kann. Die Installation und die Suche der Schriften in einem Betriebssystem ist nervig.

Wenn ich noch was tolles finde, dann werde ich es hier ergänzen. Leider ist es mir nicht gegeben alle Betriebssysteme hier einmal vollumfänglich darzustellen. Das macht ja auch so keinen Sinn. Wenn es für mich klappt, dann muss es auch erstmal reichen.

“Ich persönlich habe eigentlich nie die Schriftarten in {ggplot} geändert. Häufig haben wir dann nur die Abbildungen genommen und dann in PowerPoint nochmal die Legenden angepasst, wenn die Schriftarten nicht gepasst haben. Ich halte es eher für ein vorgeschobenes Problem um nicht R und Co. nutzen zu müssen sondern alles in Excel zu machen.” — Jochen Kruppa-Scheetz, meiner bescheidener Meinung nach.

15.4.4 Theme anpassen

Am meisten Spaß macht es dann doch nochmal das Thema der {ggplot} Abbildung anzupassen. Da geht so einiges wie wir in der Vignette Modify components of a theme nachlesen können. Ich zeige hier mal die häufigsten Fragen und dann nochmal mein Thema, welches ich hier im Buch verwende.

Position der Legende

Wo soll die Legende hin? Vielleicht einmal nach oben?

R Code [zeigen / verbergen]
theme(legend.position = "top")

Oder soll die Legende gar nicht angezeigt werden?

R Code [zeigen / verbergen]
theme(legend.position = "none")

Wenn ein einzelnes geom_* nicht angezeigt werden soll, dann kannst du auch den Eintrag in die Legende ausschalten.

R Code [zeigen / verbergen]
geom_point(show.legend = FALSE)

Eigenes Theme

Wie du in der Vignette Modify components of a theme nachlesen kannst, geht immer eine Menge, wenn es um die Änderung der Abbildung geht. Ich nutze dann immer folgendes Template, wenn es dann um meine Abbildungen geht. Daher verwende ich dann statt theme_minimal() in meinen Abbildungen immer theme_modeling(), wenn es um Modelle geht. Ich habe dann noch andere Themen in anderen Kapiteln definiert, aber das hier ist dann mein Template.

R Code [zeigen / verbergen]
theme_modeling <- function() {
  theme_minimal() +
    theme(panel.grid.minor = element_blank(),
          plot.title = element_text(size = 16, face = "bold"),
          plot.subtitle = element_text(size = 12, face = "italic"),
          plot.caption = element_text(face = "italic"),
          axis.title = element_text(size = 12, face = "bold"),
          axis.text = element_text(size = 12),
          strip.text = element_text(face = "bold"))
}

Dann können wir uns auch einmal das Template theme_modeling() in der folgenden Abbildung anschauen. Ich habe hier einfach etwas angepasst, so dass ich die Abbildung am Ende schöner fand. Das Farbthema ändere ich dann meistens auch noch, aber das ist dann weiter unten Thema.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  theme_modeling() +
  geom_boxplot() +
  scale_x_discrete(labels = c("Blut", "Ketchup", "Zuckerwasser")) +
  labs(title = "Ernährungsbedinungen",
       subtitle = "Unterschiedliche Bedingungen für die Sprungweite",
       caption = "Erhoben im Sommer 2022",
       x = "Ernährungsarten", y = "Sprungweite in [cm]",
       fill = "Ernährung")
Abbildung 15.10— Beispielhafte Anwendung des Templates theme_modeling(). [Zum Vergrößern anklicken]

15.4.5 Abbildungen beschriften

Manchmal willst du auch Abbildungen beschriften. Ich mache das ja hier die ganze Zeit. Alle meine Abbildungen sind in der zweiten Runde dann auf {ggplot} umgestellt worden. Ich haben nur noch in alten Kapiteln meine Handzeichnungen drin. Dennoch ist es immer so eine Sache. Dazu dann ein Wort von mir nochmal zum Ende. Hier einmal die beispielhafte Abbildung mit einem Text aus der Funktion annotate(). Die Funktion ist sehr mächtig, den wir können so ziemlich jedes geom_* auch annotieren. Mehr zur Beschriftung einer {ggplot} Abbildung findest du auch im R Graphics Cookbook.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = weight, y = jump_length,
                              color = feeding)) +
  theme_minimal() +  
  geom_point(alpha = 0.5) +
  annotate("text", x = 10, y = 100, label = "text", size = 5,
           fontface = 3) +
  annotate("label", x = 10, y = 200, label = "text", size = 5,
           fontface = 2) 
Abbildung 15.11— Beispielhafte Anwendung der Funktion annotate() für einen Text und ein Label. [Zum Vergrößern anklicken]

Wir haben mit der fontface-Option in element_text() die Möglichkeit auch die Schriften anzupassen. Dabei ist es dann die folgende Reihenfolge oder eben der Begriff.

Abbildung 15.12— Zuordnung der Zahlen und Begrifflichkeiten in der fontface-Option. [Zum Vergrößern anklicken]

Manchmal zeichne ich dann auch gerne mal eine Kurve oder eine Linie ein. Dafür haben wir dann die Funktionen geom_curve() und geom_segment(). Das sind dann aber schon eher die Besonderheiten in {ggplot}. Statt der Funktionen mit geom können wir dann auch die Funktionen mit annotate() anwählen.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = weight, y = jump_length,
                              color = feeding)) +
  theme_minimal() +  
  geom_point(alpha = 0.5) +
  geom_curve(aes(x = 12, y = 100, xend = 15, yend = 150),
             arrow = arrow(length = unit(0.3, "cm"), type = "closed"),
             color = "blue",
             size = 0.75,
             curvature = 0.3) +
  geom_segment(aes(x = 5, xend = 25, y = 50, yend = 100), color = "black")
Abbildung 15.13— Beispielhafte Darstellung eines Pfeils und einer Linie. [Zum Vergrößern anklicken]

Die Beschriftung von Abbildungen ist in dem Buch ggplot2: Elegant Graphics for Data Analysis (3e) super beschrieben. Aber auch hier muss man dann immer überlegen, ob sich der Aufwand dann lohnt. Das R Graphics Cookbook liefert hier auch nochmal Inspirationen. Manchmal ist der Zeitaufwand aber sehr hoch und du könntest es auch schneller mit PowerPoint lösen. Das mag in einer Abschlussarbeit mal eine gute Idee sein.

“Macht es überhaupt Sinn? Wenn du nur ein paar Abbildungen mit einem Pfeil versehen willst, dann würde ich dir immer den Weg über PowerPoint empfehlen. Dann kannst du dort deine Abbildung exportieren und im Zweifel zuschneiden. Das geht viel schneller als sich hier mit der Annotation in {ggplot} zu quälen. Aber ja, es ist sehr befriedigend, wenn es dann geklappt hat…” — Jochen Kruppa-Scheetz, meiner bescheidener Meinung nach.

15.4.6 Keine Lücke auf der y-Achse

Wenn du dir einen Barplot baust, dann hast du das Problem, dass auf der y-Achse eine kliene Lücke zu der x-Achse vorliegt. Das mag unangenehm sein. Deshalb können wir diese Lücke auch entfernen. Zuerst nochmal schnell die Daten zusammengefasst.

R Code [zeigen / verbergen]
stats_tbl <- ggplot_tbl |> 
  group_by(feeding) |> 
  summarise(mean = mean(jump_length))

Dann können wir uns auch schon die Abbildung bauen und dabei dann die Option expand = expansion(0) setzen. Damit haben wir dann keine Lücke mehr in unserer Abbildung.

R Code [zeigen / verbergen]
ggplot(stats_tbl, aes(x = feeding, y = mean)) +
  theme_minimal() +
  geom_bar(stat = "identity") + 
  scale_y_continuous(expand = expansion(0)) 
Abbildung 15.14— Beispielhafter ohne Lücke auf der y-Achse zu der x-Achse. [Zum Vergrößern anklicken]

15.4.7 Abbildungen nebeneinander

Das R Paket {patchwork} erlaubt es mehrere ggplot Abbildungen nebeneinander oder in einem beliebigen Layout miteinander zu verbinden. Das tolle ist, dass die Idee sehr intuitiv ist. Wir nutzen wieder das + um verschiedene Plots miteinander zu verbinden. Im Folgenden erschaffen wir uns zwei ggplots und speichern die Plots in den Objekten p1 und p2. Das ist wie wir es bisher kennen, nur das jetzt keine Abbildung erscheint sondern beide Plots in zwei Objekten gespeichert sind.

R Code [zeigen / verbergen]
p1 <- ggplot(data = ggplot_tbl, 
             aes(x = weight, y = jump_length,
                 color = feeding)) +
  geom_point() +
  scale_color_okabeito() +
  theme_minimal()

p2 <- ggplot(data = ggplot_tbl, 
                aes(x = feeding, y = jump_length,
                    color = feeding)) +
  geom_point() +
  scale_color_okabeito() +
  theme_minimal()

Wie können wir nun die beiden Abbildungen nebeneinander zeichnen? Wir nutzen einfach das + Symbol.

R Code [zeigen / verbergen]
p1 + p2 +
  plot_layout(ncol = 2) +
  plot_annotation(tag_levels = 'A', tag_prefix = '(', tag_suffix = ')') &
  theme(plot.tag = element_text(size = 16, face = "bold"))
Abbildung 15.15— Beispielhafte Abbildung der zweier Plots nebeneinander für die Sprungweite und zwei Einflussvariablen. (A) Zusammenhang zwischen dem Gewicht und der Sprungweite. (B) Zusammenhang der Ernährungsart und der Sprungweite. [Zum Vergrößern anklicken]

Auf der Seite des R Paket {patchwork} findest du viel mehr Möglichkeiten das Layout anzupassen und auch die einzelnen Subplots zu beschriften.

15.4.8 Abbildungen abspeichern

Wenn du eine Abbildung abspeichern willst, dann musst du nur nach dem ggplot-Code die Funktion ggsave() setzen. Wie du im hier im Folgenden siehst, speichere ich die Abbildung der Boxplots der Hunde- und Katzenflöhe einmal in der Datei flea_dog_boxplot.png ab. Dabei wähle ich eine Breite width und eine Höhe height von jeweils 5. Du musst dann immer etwas spielen, je größer die Zahlen, desto größer die Abbildung und die Auflösung.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, 
       aes(x = feeding, y = jump_length)) +
  geom_boxplot() 

## Abspeichern des obigen ggplots  
ggsave("feeding_boxplot.png", width = 5, height = 5)

Wie immer hilft auch die Hilfeseite von ggsave() weiter, wenn es um mehr Optionen und Qualität der Abbildungen geht und natürlich das Kapitel im Buch ggplot2: Elegant Graphics for Data Analysis (3e) wo wir nochmal über verschiedene Formate wie PDF und PNG aufgeklärt werden.

15.4.9 Mathematische Ausdrücke

Häufig wollen wir nicht nur einfache Achsenbeschriftungen haben, sondern auch irgendwie komplexere Einheiten wie Eisendüngergehalt im Boden in \([kg\, ha]^{-1}\) darstellen. Jetzt soll die Einheit auch in dieser Form mit in die Achsenbeschriftung. Wir können dafür zwei Wege wählen. Einmal über das R Paket {latex2exp} und die Funktion TeX() oder aber die Funktion expression(), wofür wir dann kein eigenes R Paket brauchen. Beide Wege haben Vor- und Nachteile. Wir gehen aber beide mal durch. Mehr Informationen durch das Tutorium Using latex2exp oder aber eben der Klassiker mit Plot math expression.

Wir können die Funktion expression() nutzen um uns mathematische Formeln zu bauen. Leider ist das Ganze etwas frickelig und auch ich brauche immer drei Anläufe, bis die Formel dann passt. Im Folgenden aber einmal zwei Beispiel für mathematische Formeln und Ausdrücke. Beachte, dass du jedes Leerzeichen durch eine Tilde ~ abbilden musst. Ich nutze die Funktion expression() sehr selten und nur wenn die Formel wirklich sehr einfach ist. Da wir aber schon mit eckigen Klammern Probleme kriegen und diese so nervig mit " einklammern müssen, nutze ich dann das Paket {latex2exp} was ich im Folgenden vorstellen werde.

Hier aber erstmal zwei Beispiele für eine Formel mit der Funktion expression(). Wenn du mehr über die Möglichkeiten wissen willst, dann schauen auch einmal auf die Hilfeseite von Plot math oder du googelst dir die Lösung wie ich früher zusammen.

R Code [zeigen / verbergen]
plot(expression(Eisendüngeform~und~-höhe~"[kg ha]"^-1), cex = 1.5, main = "")

R Code [zeigen / verbergen]
plot(expression(Fe-Gehalt~"["~mg%.%(kg~TM)^-1~"]"), cex = 1.5, main = "")

Für mich ausdrücklich einfacher geht es mit dem R Paket {latex2exp} und der Funktion TeX() sowie die Helferfunktion r"()". Ja, hier muss man dann noch eine andere Programmiersprache kennen, aber wie immer, du wirst nur schlauer. Die Informationen zur Matheumgebung in \(\LaTeX\) kommen dann nochmal extra zwischen zwei Dollarzeichen $. Ja, das ist etwas wirr für einen Anfänger, aber wir nutzen hier auch zwei Programmiersprachen zusammen. Zum einen \(\LaTeX\) um die Mathesymbole sauber darzustellen und dann R um die Abbildungen in ggplot() zu bauen. Mehr Informationen zu der Matheumgebung in \(\LaTeX\) findest du einmal in der LaTeX Mathehilfe I sowie der LaTeX Mathehilfe II.

Wie bauen wir uns also unseren mathematischen Ausdruck? Als erstes brauchen wir die Funktion Tex(), die sagt einfach nur aus, dass jetzt \(\LaTeX\)-Code kommt. Dann wollen wir noch einen String brauen in dem der \(\LaTeX\)-Code für unseren mathematischen Ausdruck drin steht. Diesen String bauen wir mit r"()". Achtung, hier ist das Gänsefüßchen oben und unten vor und nach der runden Klammer sehr wichtig. In den Ausdruck können wir dann Text schreiben Eisengehalt oder aber einen mathematischen Ausdruck abgrenzt von zwei Dollarzeichen $ wie $[kg\, ha]^{-1}$. \(\LaTeX\) kann nämlich nicht nur mathematische Ausdrücke sondern ist eigentlich ein Textverarbeitungsprogramm. Deshalb musst du hier nochmal zwischen Text und mathematischen Ausdruck unterscheiden.

Hier nochmal aufgeschlüsselt wie der Code aussieht. Wir schreiben den Code nachher in einer Zeile, aber zum Verständnis ist es besser, wenn wir den Code einmal aufgeklappt sehen.

R Code [zeigen / verbergen]
TeX(
    r"(
      Eisengehalt $[kg\, ha]^{-1}$
    )"
   )

Wir wollen uns das Ergebnis einmal in einem simplen plot() anschauen. Wir nutzen die Funktionalität natürlich später in ggplot, aber hier ist es so einmal einfacher zu sehen.

R Code [zeigen / verbergen]
plot(cex = 2, main = "",
  TeX(r"(
         Eisengehalt $[kg\, ha]^{-1}$
      )")
    )

Auch können wir sehr viel komplexere Formeln erstellen. Beachte auch hier, dass wir zwei Matheumgebungen in \(\LaTeX\) vorliegen haben.

R Code [zeigen / verbergen]
plot(cex = 2, main = "",
  TeX(r"(
         A $\LaTeX$ formula: $\frac{2hc^2}{\lambda^5}\frac{1}{e^{\frac{hc}{\lambda k_B T}} - 1}$
      )")
  )

In der Abbildung 15.16 dann nochmal die Anwendung in einem ggplot in dem wir die Achsen entsprechend beschriften und dann auch noch eine ausgedachte Regressionsgeleichung zu der Abbildung ergänzen.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = weight, y = jump_length)) +
  geom_point() +
  stat_smooth(method = "lm", se = FALSE) +
  theme_minimal() +
  labs(x = TeX(r"(Eisengehalt und -höhe $[kg\, ha]^{-1}$)"), 
       y = TeX(r"(Fe-Gehalt $[mg \cdot (kg TM)^{-1}]$)")) +
  annotate("text", x = 10, y = 200,
           label = TeX(r"($y = \beta_0 + \beta_1 \cdot x;\; R^2 = 0.24$)"))
Abbildung 15.16— Zusammenhang zwischen dem Eisengehalt und -höhe im Boden und dem Eisengehalt in Salat. Zusätzlich ergänzt eine Regressiongleichung und ein ausgedachtes Bestimmtheitsmaß. [Zum Vergrößern anklicken]

Wenn du dann mal die Funktion Tex() in geom_text() verwenden willst, dann musst du einmal etwas anpassen. Dann klappt es aber auch hier. Das hat mich mal echt Nerven und Zeit gekostet, deshalb lagere ich die Information mal hier für mich.

R Code [zeigen / verbergen]
ggplot() +
  theme_void() +
  geom_text(aes(0, 0, 
                label = TeX(r'($\alpha  x^\alpha$, where $\alpha \in 1\ldots 5$)',
                                  output = "character")), parse = TRUE) 

15.4.10 Farbpaletten

Die Farben können weitreichend angepasst werden. Weiter unten findest du dann noch verschiedene Farbpaletten. Wenn du deine Farben selber wählst, dann kann es manchmal etwas kunterbund aussehen. Neben den klassischen Farben im R Paket {ggplot2} gibt es noch weit, weit mehr Farbpaletten. Wir nutzen in der Folge immer wieder die Okabe-Ito Farbpalette aus dem R Paket {see}. Die Okabe-Ito Farbpalette ist speziell so gebaut, dass die Farben sich gut für farbenblinde Personen unterscheiden. Mehr zum R Paket {see} auf der Hilfeseite des Paketes. Der Kontrast zwischen den Farben ist sehr gut. Wenn du eine andere Farbpalette nutzen willst, findest du hier noch andere Color Scales.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, 
       aes(x = feeding, y = jump_length,
           fill = feeding)) +
  geom_boxplot() +
  scale_fill_okabeito() +
  theme_minimal()
Abbildung 15.17— Beispielhafte Abbildung der Okabe-Ito Farbpalette für Boxplots. [Zum Vergrößern anklicken]
R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, 
       aes(x = feeding, y = jump_length,
           fill = feeding)) +
  geom_point() +
  scale_color_okabeito() +
  theme_minimal()
Abbildung 15.18— Beispielhafte Abbildung der Okabe-Ito Farbpalette für Punkte. [Zum Vergrößern anklicken]

Das Ganze geht dann auch händisch mit dem folgenden Code für die jeweiligen Farben. Anbei einmal die Farbpalette dargestellt.

Abbildung 15.19— Farbpalette nach dem Okabe-Ito-Schema ebenfalls für farbblinde Personen erstellt. [Zum Vergrößern anklicken]

Die Farben sind dann in der Reihenfolge wie folgt kodiert.

R Code [zeigen / verbergen]
cbbPalette <- c("#E69F00", "#56B4E9", "#009E73", 
                "#F0E442", "#0072B2", "#D55E00", 
                "#CC79A7", "#999999", "#000000")

Wenn wir Boxplots einfärben wollen dann nehmen wir den folgenden Code.

R Code [zeigen / verbergen]
scale_fill_manual(values = cbPalette)

Und das hier ist die Ergänzung für Punkte und Linien.

R Code [zeigen / verbergen]
scale_colour_manual(values = cbPalette)

Neben der Okabe-Ito Farbpalette liefert das R Paket {duke} noch eine andere Möglichkeit eine Farbpalette für Farbblinde zu generieren.

Abbildung 15.20— Farbpalette nach dem Duke-Schema ebenfalls für farbblinde Personen erstellt. [Zum Vergrößern anklicken]

Die Farben sind dann in der Reihenfolge wie folgt kodiert.

R Code [zeigen / verbergen]
dukePalette <- c("#012169", "#C84E00", "#00539B", "#339898", 
                 "#A1B70D", "#E89923", "#FFD960", "#262626")

Die Funktionen hier sind scale_duke_color_discrete() sowie scale_duke_continuous() und scale_duke_fill_discrete().

Manchmal benötigen wir auch Farbverläufe. In R heißen diese Farbverläufe dann Farbpaletten. Eine Einführung liefert das Tutorium Using RColorBrewer palettes. Ich selber nutze gerne das R Paket {wesanderson} welches sehr schöne Farbverläufe hat. Mehr kannst du auf der GitHub Seite Wes Anderson Palettes erfahren. Wir können die Paletten ganz einfach mit der Funktion wes_palette() laden.

R Code [zeigen / verbergen]
wes_palette("Zissou1")

Das schöne ist hier, dass wir einfach wie folgt Farbverläufe erstellen können. Wir wollen hier 21 Farbwerte haben und das Ganze dann als kontinuierlichen Verlauf.

R Code [zeigen / verbergen]
wes_palette("Zissou1", 21, type = "continuous")

15.4.11 Lange Namen auf der x-Achse

Manchmal haben wir das Problem, dass unsere Namen der Level der Faktoren zu lang werden oder wir zu viele Namen eben abbilden wollen. Der Blogpost Quick and easy ways to deal with long labels in {ggplot} hilft hier einmal. Ich habe mich dann meistens für die folgende Lösung entschieden.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  theme_minimal() +
  geom_boxplot() +
  scale_x_discrete(labels = c("Blutkonserven aus Rinderblut", 
                              "Ketchup aus einer Flasche", 
                              "Zuckerwasser mit Fruktose"),
                   guide = guide_axis(n.dodge = 2)) 
Abbildung 15.21— Beispielhafte Abbildung mit gestapelten Gruppen auf der x-Achse. [Zum Vergrößern anklicken]

Das Rotieren um 45° mag auch eine Lösung sein, aber ich fand es dann immer schwerer zu lesen. Wenn es aber wirklich viele Gruppen sind, dann mag es dann doch eine der besseren Lösungen sein. Du kannst ja dann noch den Winkel entsprechend anpassen. Ich muss immer mit hjust spielen, bis es dann gut passt.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  theme_minimal() +
  geom_boxplot() +
  scale_x_discrete(labels = c("Blutkonserven aus Rinderblut", 
                              "Ketchup aus einer Flasche", 
                              "Zuckerwasser mit Fruktose")) +
  theme(axis.text.x = element_text(angle = -45, hjust = 0))
Abbildung 15.22— Beispielhafte Abbildung mit einer 45° Drehung der Gruppen auf der x-Achse. [Zum Vergrößern anklicken]

Am Ende sei dann noch auf die Funktion label_wrap() aus dem Paket {scales} verwiesen, die dir dann einen automatischen Zeilenumbruch mit einbaut. Da musst du dann spielen, ob du wirklich einen Zeilenbruch vertreten kannst oder nicht. Manchmal willst du dann die Namen zusammenhaben und nicht auseinandergerissen.

15.4.12 Zoomen

Mir ist dann noch vor kurzem über den Weg gelaufen, dass wenn wir ylim() nutzen um in eine Abbildung zu zoomen, wir automatisch auch die Abbildungen wie einen Boxplot verändern. Wir entfernen mit ylim() wirklich die Werte aus der Berechnung der Abbildung. Wenn wir Zoomen wollen, also wirklich die Abbildungen auf allen Werten aber näher dran, dann müssen wir die Funktion coord_cartesian() nutzen. In dem folgenden Beispiel siehst du einmal die Anwendung. Dazu dann noch mein eigenes Theme mit theme_modeling() von weiter oben sowie die Anwendung des R Pakets {patchwork} um die Abbildungen nebeneinander darzustellen.

R Code [zeigen / verbergen]
p1 <- ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                                      fill = feeding)) +
  theme_modeling() +
  geom_hline(yintercept = 93, colour = "red") + 
  geom_boxplot() +
  theme(legend.position = "none")

p1 + ggtitle("Original") +
p1 + coord_cartesian(ylim = c(55, 125)) + 
  ggtitle("coord_cartesian()", subtitle = "Boxplots auf allen Werten") +
p1 + ylim(55, 125) + 
  ggtitle("ylim()", subtitle = "Boxplots auf ylim Werten") +
  plot_layout(ncol = 3) +
  plot_annotation(tag_levels = 'A', tag_prefix = '(', tag_suffix = ')') &
  theme(plot.tag = element_text(size = 16, face = "bold"))
Abbildung 15.23— Problematisches Verhalten der Option ylim() beim Zoomen in eine Abbildung. Besser hierfür die Funktion coord_cartesian() verwenden. [Zum Vergrößern anklicken]

15.4.13 Abbildungen aufteilen

Die Funktion facet_wrap() erlaubt es dir nach einem Faktor die Abbildungen einmal aufzuteilen. Wir werden später noch das R Paket {ggh4x} kennenlernen, welches noch besser mit der Aufteilung klarkommt. Hier aber einmal das simpelste Beispiel. Wir wollen die Ernährungsformen einmal getrennt für die beiden Entwicklungsstände darstellen. Wir haben auch hier die Möglichkeit festzulegen, dass die Einheiten auf der x- und y-Achse eben auch frei sein können. Dazu nutzen wir die Option scales = "free_x" oder scales = "free_y". Ich persönlich nutze die Option hier nur bei der explorativen Datenanalyse. Wenn ich dann meine Abbildungen habe, würde ich eher über {patchwork} mit die einzelnen Abbildungen zusammenkleben als über die Funktion facet_wrap(). Aber das ist dann Geschmackssache.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  geom_boxplot() +
  facet_wrap(~ stage)
Abbildung 15.24— Aufteilung der Ernährungsformen nach den beiden Entwicklungsständen. [Zum Vergrößern anklicken]

15.4.14 Gebrochene \(y\)-Achse

Das R Paket {ggbreak} erlaubt es dir in die \(x\)-Achse oder aber \(y\)-Achse Lücken einzusetzen oder aber die Achsen eben gebrochen darzustellen. Zur Demonstration bauen wir uns nochmal den stat_tbl für die Hunde- und Katzenflöhe. Wir berechnen hier dann die Mittelwerte und nicht mehr die Standardabweichung, da es sonst nicht so gut mit der Darstellung mit der gebrochenen \(y\)-Achse für dieses Beispiel klappt.

R Code [zeigen / verbergen]
stat_tbl <- ggplot_tbl |> 
  group_by(feeding) |> 
  summarise(mean = mean(jump_length))

In der Abbildung 15.25 siehst du einmal die Abbildung der Mittelwerte der Sprungweiten der Hunde- und Katzenflöhe als Barplots dargestellt. Ich habe hier einen Bruch auf der \(y\)-Achse mit der Funktion scale_y_break() bei 1 bis 4 eingefügt und den Abstand über die Option space etwas visuell vergrößert. Mit der Option scales könntest du dann noch die Skalierung der gebrochenen \(y\)-Achse anpassen.

R Code [zeigen / verbergen]
ggplot(stat_tbl, aes(x = feeding, y = mean, fill = feeding)) + 
  theme_minimal() +
  geom_bar(stat = "identity") +
  scale_y_break(c(10, 60), space = 0.5)
Abbildung 15.25— Beispielhafte Abbildung der Barplots mit gebrochener \(y\)-Achse. Die Fehlerbalken wurden aus Gründen der besseren Darstellung der zerbrochenen \(y\)-Achse entfernt. [Zum Vergrößern anklicken]

15.5 R Pakete von Interesse

Manchmal braucht es mehr, als nur {ggplot} zu bieten hat. Deshalb gibt es eine riesige Auswahl an zusätzlichen R Paketen, die sich nur mit der Erstellung von Abbildungen im Universum von {ggplot} beschäftigen. Hier will ich nicht alle vorstellen, dass macht auch überhaupt keinen Sinn. Es gibt aber immer wieder R Pakete, die finde ich so nützlich, dass ich diese Pakete gerne wiederfinden würde. Meistens brauche ich dann die Pakete aber doch nicht jeden Tag oder häufig. Dann vergesse ich eventuell den Namen oder gar das Paket. Daher ist diese Sammlung also auch für mich eine Art Bibliothek wo ich immer mal schauen kann was es so gibt. Wenn ich ein neues R Paket entdecke, dann ergänze ich das Paket mal eben hier.

TippWoher habe ich alle Pakete her?

Wenn es einen Link zu einer Seite gibt, den ich immer mal wieder Besuche, ist es der folgende Link: ggplot2 extensions. Du erfährst hier eine Menge neues an Paketen und es gibt immer wieder spannendes zu entdecken. Ein Besuch lohnt sich auf jeden Fall.

Gehen wir also einmal die sicherlich nie vollständige Liste an R Paketen einmal durch. Die Pakete haben keine richtige Ordnung. Du musst schauen, ob dich was anspricht. Häufig musst du dann auch nochmal die Hilfeseiten hinter den Links besuchen. Hier gebe ich nur einen Einblick für die Anwendungen die ich eben gebraucht habe und glaube wieder zu brauchen.

15.5.1 {forcats}

Das erste Paket hier hat eigentlich gar nicht so richtig was mit {ggplot} zu tun. Mit dem R Paket {forcats} haben wir eigentlich nur eine bessere Art mit Faktoren umzugehen. Das brauchen wir dann auch für faktorielle Experimente, aber auch bei {ggplot} lohnt sich eine saubere Definition der kategorialen Variablen. Wir können mit der Funktion fct() sauber Faktoren erstellen und haben eine weitreichende Anwendungsmöglichkeiten. Hier empfehle ich dann das Cheat sheet {forcats} um einemla einen Überblick zu erhalten. Hier einmal alle Funktionen durchzugehen sprengt dann das Kapitel. Ich nutze das R Paket immer mal wieder, aber hier hat es auf jeden Fall auch seine Nützlichkeit.

15.5.2 {ggrepel}

Das R Paket {ggrepel} ist die Antwort auf die Frage, ob es nicht irgendwie eine Möglichkeit gibt intelliegent einmal die Labels in einem Plot anzuordnen. Hier dann wiederum nur ein Beispiel, es gibt aber eine Menge Beispiele für {ggrepel} zum Nachbauen und sich inspieren lassen. Die Idee ist eben, dass die LAbels so angeordnet werden, dass wir kein Überlappen der Worte haben und wenn dann doch, wird eben ein Pfeil oder Strich gezeichnet. Das ist super praktisch, wenn wir mal wirklich viele Punkte aufeinmal beschriften wollen.

R Code [zeigen / verbergen]
ggplot(ggplot_tbl, aes(x = weight, y = jump_length,
                       label = weight)) + 
  theme_minimal() +
  geom_point() +
  geom_text_repel()
Abbildung 15.26— Beispielhafte Anwendung des R Paketes {ggrepel} für die Beschriftung aller Punkte mit den entsprechenden Flohgewichten. [Zum Vergrößern anklicken]

15.5.3 {ggh4x}

Das R Paket {ggh4x} liefert nochmal eine Reihe von Funktionen in {ggplot} Sachen schöner zu machen. Der zentrale Teil ist aber facet_wrap2(). Mit dieser Funktion können wir dann die Aufteilung viel besser kontrollieren und somit auch schöner einen Faktor getrennt über einen anderen Faktor darstellen. Schaue dir dazu gerne einmal die ausführliche Vignette des Paketes an. Hier zeige ich dann nur einmal ein kurzes Beispiel zur Veranschaulichung.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = stage, y = jump_length,
                              fill = stage)) +
  theme_minimal() +
  geom_boxplot() +
  facet_wrap2(~ feeding, axes = "all")
Abbildung 15.27— Aufteilung der Ernährungsformen nach den beiden Entwicklungsständen. [Zum Vergrößern anklicken]

15.5.4 {ggtext}

Was super nervt ist immer, wenn wir uns mit der Textformatierung rumschlagen müssen. Ich habe ja schon oben bei den Schriftarten geschrieben, dass es noch Lösungen gibt. Das R Paket {ggtext} ist mit der Funktion element_markdown() und den Markdown theme elements ein Paket davon. Es gibt aber noch weitere Funktionen und Möglichkeiten in dem R Paket, wie du in der Vignette Plotting with markdown text dir anschauen kannst. Im Prinzip ist das R Paket {ggtext} nochmal eine Möglichkeit alles was in Text in deiner Abbildung vokommt nochmal schhöner zu gestalten. Es gilt wie immer, das ist einigen zu viel udn auch nicht nötig. Manchmal möchtest du es dann aber wissen, dann geht es hier in den Kaninchenbau der Textformatierung. Du kannst mit den klassischen Markdownbefehlen deinen text in einer {ggplot} Abbildung formatieren. Ganz wichtig, du musst immer über theme() dann den entsprechenden Teil in deiner Abbdilung auf element_markdown() setzen.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  theme_minimal() +
  geom_boxplot() +
  labs(x = "**Ernährungsarten**", y = "*Sprungweite in [cm]*") +
  theme(legend.position = "none",
        axis.title = element_markdown())
Abbildung 15.28— Beispielhafte Abbildung mit Titel und geänderter Achsenbeschrittung mit Markdown. [Zum Vergrößern anklicken]

Neben klassischen Markdown kannst du auch HTML Elemente verwenden. Das macht die Abbildiungen dann noch komplexer und noch kleinteiliger. Hier kannst du dann einzelne Worte oder aber Teile deiner Texte in den Abbildungen ändern. In der folgenden Tabelle dann einmal ein paar Beispiele für HTML Elemente, die du in deiner Abbildung nutzen kannst.

Tabelle 15.2— Ausgewählte HTML Codes und deren Darstellung.
HTML Element Darstellung
x<sup>2</sup> \(x^2\)
x<sub>2</sub> \(x_2\)
<span style = 'color:#0072B2;'> text </span> \(\textcolor{#0072B2}{text}\)
<br> Zeilenumbruch

Wenn wir die HTML Elemente dann anwenden wollen, dann müssen wir auch hier daran denken, dass wir die entsprechenden Teile in der Abbildung im theme() dann auch auf element_markdown() setzen. Wenn du das vergisst, dann ändert sich in den Abbildungen erstma rein gar nichts. Hier siehst du dann auch ganz schön, dass sich so gewisse mathematische Ausdrücke auch in HTML darstellen lassen. Auch hier kommt es dann auf die Komplexität an. Einfache Einheiten lassen sich hier so auf jeden Fall einfacher darstellen.

R Code [zeigen / verbergen]
ggplot(data = ggplot_tbl, aes(x = feeding, y = jump_length,
                              fill = feeding)) +
  theme_minimal() +
  geom_boxplot() +
labs(
    x = "Horse power [E<sup>2</sup>]",
    y = "Miles per gallon (MPG)",
    title = "<span style = 'font-size:14pt; font-family:Helvetica;'>Transmission type impacts fuel efficiency</span><br>
MPG is higher for <span style = 'color:#0072B2;'>automatic</span>
than for <span style = 'color:#D55E00;'>manual</span> transmissions"
  ) +
  theme(legend.position = "none",
        plot.title = element_markdown(size = 11, lineheight = 1.2),
        axis.title = element_markdown(size = 11))
Abbildung 15.29— Beispielhafte Abbildung mit Titel und geänderter Achsenbeschrittung angepasst durch HTML Elemente. [Zum Vergrößern anklicken]

Dann können wir auch noch die Abbildungen durch ein facet_wrap() schöner machen. Hier können wir dann natürlich auch noch das R Paket {ggh4x} mit nutzen um dann wirklich alles rauszuholen. Ich finde aber die Möglichkeit einmal die einzelnen Subplots schöner zu beschriften schon super. Am Ende nutze ich diese Option abr eher weniger sondern baue mir dann immer die einzelnen Plots und klebe diese dann über {patchwork} zusammen. Das ist dann aber wirklich nur noch eine Geschmacksfrage.

R Code [zeigen / verbergen]
ggplot(ggplot_tbl, aes(x = stage, y = jump_length)) +
  theme_minimal() +
  geom_boxplot() +
  facet_wrap(~ feeding) +
  theme(
    strip.background = element_blank(),
    strip.text = element_textbox(
      size = 12,
      color = "white", fill = "#5D729D", box.color = "#4A618C",
      halign = 0.5, linetype = 1, r = unit(5, "pt"), width = unit(1, "npc"),
      padding = margin(2, 0, 1, 0), margin = margin(3, 3, 3, 3)
    )
  )
Abbildung 15.30— Beispielhafte Abbildung für eine facet_wrap() Abbildung mit schöneren Subtiteln. [Zum Vergrößern anklicken]

15.5.5 {ggdist}

Das R Paket {ggdist} ist ein mächtiges Paket, wenn es darum geht Verteilungen darzustellen. Dafür brauchen wir dann aber auf der anderen Seite auch einiges an Beobachtungen pro Gruppe. Ich würde mal sagen, dass wir hier schnell mal von mittleren zweistelligen Zahlen an Beobachtungen sprechen. Wir können hier aber trotzdem mal zeigen, was das R Paket so kann. Im Folgenden einmal die Verteilung der Sprungweiten auf der x-Achse und die Gruppen auf der y-Achse. Ich habe dann noch die einzlenen Beobachtungen nach dem Entwicklungsstand und der Ernährungsform aufgeteilt.

R Code [zeigen / verbergen]
ggplot_tbl |> 
  ggplot(aes(x = jump_length, y = feeding, color = stage)) +
  theme_minimal() +
  geom_point(position = position_dodge(0.4)) +
  scale_color_okabeito() +
  theme(legend.position = "top")
Abbildung 15.31— Darstellung der Sprungweite in Abhängigkeit der Ernährungsform und dem Entwicklungsstand. Hier einmal gedereht für die x- und y-Achse um gleich die Verteilungen etwas besser zeigen zu können. [Zum Vergrößern anklicken]

Dann können wir einmal ein lineares Modell schätzen um uns gleich mal die Koeffizienten mit den entsprechenden Fehlern als Verteilung anzuschauen.

R Code [zeigen / verbergen]
jump_feeding_fit <- lm(jump_length ~ feeding * stage, data = ggplot_tbl)

In der folgenden Abbildung siehst du dann einmal die Koeffizienten und deren Fehler als Verteilung einmal dargestellt. Hier siehst du sehr schön, dass die Koeffizienten als Punktschätzer eigentlich aus einer Verteilung stammen, die natürlich auch einen Fehler hat. Der Koeffizient ist eben dann doch nichts anders als der Wert wo die Verteilung ihren Schwerpunkt hat. Wir sehen hier im rinzip die Visualisierung der summary() Ausgabe eines linearen Modells.

R Code [zeigen / verbergen]
jump_feeding_fit |> 
  tidy()  |> 
  ggplot(aes(y = term)) +
  theme_minimal() +
  stat_halfeye(aes(xdist = dist_student_t(df = df.residual(jump_feeding_fit), 
                                          mu = estimate, sigma = std.error)))
Abbildung 15.32— Darstellung der Koeffizienten aus einer linearen Regression zusammen mit dem Fehler und der Verteilung aus der der Punktschätzer stammt.. [Zum Vergrößern anklicken]

Jetzt können wir nochmal richtig ausholen und dann nochmal alles zusammenbringen. Wir schauen uns die Punktschätzer aus der linearen Regression mit den Koeffizienten an. Dann bringen wir noch die einzelnen Beobachtungen mit ein. Damit haben wir dann die Daten mit den theoretischen Koeffizienten zusammen. Da sehen wir dann auch gleich die Effekte der Ernährungsformen auf die Sprungweite und das sich die Effekte bei einer Zuckerernährung und dem Entwicklungsstand umdrehen.

R Code [zeigen / verbergen]
expand(ggplot_tbl, feeding, stage) |> 
  augment(jump_feeding_fit, newdata = _, se_fit = TRUE) |> 
  ggplot(aes(y = feeding, color = stage)) +
  theme_minimal() +
  stat_halfeye(aes(xdist = dist_student_t(df = df.residual(jump_feeding_fit), 
                                          mu = .fitted, sigma = .se.fit),
                   fill = stage),
               scale = 0.5, alpha = 0.5) +
  geom_point(data = ggplot_tbl, aes(x = jump_length),
             pch = "|", size = 3, position = position_nudge(y = -.15)) +
  scale_color_okabeito() +
  scale_fill_okabeito() +
  theme(legend.position = "top")
Abbildung 15.33— Darstellung der Sprungweite in Abhängigkeit von der Ernährungsform der Flöhe und dem Entwicklungstand. Die Verteilung der Koeffizienten ist zusammen mit den beobachteten Daten dargestellt. [Zum Vergrößern anklicken]

Am Ende möchte ich dann nochmal auf das R Paket {distributional} verweisen, was erlaubt auch noch andere Verteilungen für die Koeffizienten zu wählen. Häufig reicht hier die t-Verteilung oder Normalverteilung aus, aber es gibt eben dann noch mehr Möglichkeiten. Das Paket ist jedenfalls klasse, wenn es um Verteilungen geht.

15.5.6 {ggpmisc}

Ich nutze das R Paket {ggpmisc} im Besonderen, wenn ich eine Grade durch eine Punktewolke legen will. Dafür ist das R Paket richtig super. Wir erhalten realtiv einfach die Gradengleichung und auch das Bestimmtheitsmaß angegeben. Wir haben also die Möglichkeit in einer explorativen Datenanalyse einmal zu spielen und dann gleich die Gradengleichung. Das ist jetzt aber ein sehr spezieller Fall. Deshalb hier nur der Link zu dem Paket. Ich zeige die Anwendung nochmal kurz bei dem Scatterplot in dem Kapitel zur Visualisierung von Daten. Dort ist es auch besser aufgehoben. Sonst verteilt sich das Paket recht gleichmäßig immer mal wieder bei den Regressionsanalysen. Hier einmal ein Beispiel mit den Sprungweiten aus unseren Daten.

R Code [zeigen / verbergen]
ggplot(ggplot_tbl, aes(x = weight, y = jump_length)) +
  theme_minimal() +
  geom_point() +
  stat_poly_line(formula = y ~ x, se = FALSE) +
  stat_poly_eq(formula = y ~ x, mapping = use_label(c("eq", "r2"))) +
  labs(x = "Gewicht der Katzenflöhe [mg]", y = "Sprungweite in [cm]") +
  ylim(0, NA) + xlim(0, NA)
Abbildung 15.34— Zusammenhang zwischen der Sprungweite in [cm] und Gewicht. Jeder Punkt stellt eine Beobachtung dar. Die Grade wird durch die Punkte gezeichnet und die Gradengleichung zusammen mit dem Bestimmtheitsmaß \(R^2\) angegeben.

15.5.7 {patchwork}

Das R Paket {patchwork} bietet die Möglichkeit Abbildungen nebeneinander darzustellen. Hier findest du einmal den Code, den ich hier in diesem Buch nutze. Dafür ist der Abschnitt auch nur da. Damit ich den Code kopieren kann.

R Code [zeigen / verbergen]
p1 + p2 +
  plot_layout(ncol = 2) +
  plot_annotation(tag_levels = 'A', tag_prefix = '(', tag_suffix = ')') &
  theme(plot.tag = element_text(size = 16, face = "bold"))

Hier gibt es dann nicht mehr zu sehen. Ausgeführten Code findest du dann weiter oben in dem Abschnitt zu den Abbildungen nebeneinander. Das dient hier nur für mich um dann nochmal schnell auf meine Vorlagen zurückgreifen zu können.

15.5.8 {gganimate}

Das R Paket {gganimate} liefert die Möglichkeit animierte Abbildungen zu erstellen. Es gibt auf der Seite von Datanovia - How to Create Plots with Beautiful Animation in R nochmal einen Blogpost dazu und auch das Cheat sheet {gganimate} hilft weiter. Ich persönlich finde aber die Anwendung immer etwas sperrig. Oder andersherum, ich habe mich noch nicht so richtig in den Code und die Funktionen reinfuchsen können. Nicht jede Funktion klappt auf Anhieb und dann muss man fummeln bis es geht. Anbei einmal eine mögliche Darstellung. Es geht so viel mehr, aber aktuell fehlt mir die Zeit und der Wille mich tiefer mit {gganimate} zu beschäftigen.

R Code [zeigen / verbergen]
ggplot(ggplot_tbl, aes(x = weight, y = jump_length,
                       color = feeding)) + 
  theme_minimal() +
  geom_point(aes(group = seq_along(feeding))) +
  theme(legend.position = "top") +
  transition_reveal(weight) 
Abbildung 15.35— Beispielhafte Anwendung der Funktion transition_reveal() auf dem Flohgewicht. [Zum Vergrößern anklicken]

Am Ende bin ich dann gescheitert hier einmal anständig geom_smooth() zu ergänzen, was ja auch wirklich mal das Interessanteste wäre. Das geht auch leider nicht mit dem R Paket {ggpmisc} einfach so. Damit ist dann hier erst recht erstmal Pause für mich.

“Das R Paket {gganimate} klingt super spannend und ich war auch begeistert es zu nutzen. Dann fand ich aber nicht so richtig eine Anwendung. Vielleicht bei Zeitreihen oder aber bei Verläufen. Aber so richtig nutzen tue ich {gganimate} nicht, so dass das Paket hier erstmal parkt, bis ich eine bessere Anwendung gefunden habe. Gut zu wissen das es {gganimate} gibt.” — Jochen Kruppa-Scheetz, meiner bescheidener Meinung nach.

TippMehr Pakete von Interesse

Manchmal finde ich irgendwo ein R Paket und denke, dass könnte von Interesse sein und irgendwie dann doch mit in Visualisierung passen. Daher schreibe ich mir das Paket erstmal hier auf und schaue später mal vorbei. Es sind eben dann auch Daten dabei, die man mal visualisieren könnte. Manchmal passen die Pakete hier auch nicht so richtig zur Visualisierung. Aber erstmal sammeln.

Nr. Link Beschreibung
1. R Paket {collapse} Das R Paket {collapse} ist ein umfangreiches C/C++-basiertes Paket für die Datenumwandlung und statistische Berechnungen in R. Es ist super spannend, aber mir fehlte bis jetzt die Zeit. Wenn deine Daten riesig werden, dann ist das hier deine Lösung.
2. R Paket {visibly} Das Paket erlaubt dir schnell die passenden Farben für deine Analysen zu finden, die maximal verschieden sind. Daneben gibt es noch weitere Funktionen um Farben und Visualisierungen.
3. R Paket {gapminder} Hier noch ein Paket mit Daten von Gapminder und damit eine Möglichkeit nochmal auf große soziodemographische Daten zuzugreifen. Es ist eien super Quelle und man kann sich in den Daten verlieren.
4. R Paket{emojifont} Nochmal etwas zu Emojis und die Möglichkeit diese dann in R darzustellen. Nur alleine in {ggplot} ist es eine Sache, das ganze dann aber mit Quarto und HTML eine andere. Ich habe es nicht weiter vertieft.
5. R Paket{emo} Eine Möglichkeit nochmal anders Emojis darzustellen. Ich hatte das Paket gefunden aber nicht mehr ausprobiert.
6. R Paket {ggpp} Eine weitere Möglichkeit Tabellen und verschiedene Abbildungen ineinander zu verschränken. Also Tabellen innerhalb eines {ggplot}s zu plotten oder aber noch wildere Sachen. Am Ende habe ich es nie angewendet.
7. R Paket {ggsignif} Auch hier hast du nochmal die Möglichkeit einen statistischen Test direkt in deine Abbildung darstellen zu lassen. Fand ich interessant, habe es aber dann auch nie selber verwendet.

Diese Liste kann natürlich beliebig erweitert werden. Für mich ist es dann ein ewiger Arbeitsauftrag mich mal mit dieser Liste zu beschäftigen. Teilweise sind aber die Pakete auch hier für dich. Ich fand es interessant, habe das Paket dann aber doch (noch) nicht genutzt.

Referenzen

Wickham, H., & Grolemund, G. (2016). R for data science: import, tidy, transform, visualize, and model data. O’Reilly Media, Inc.