Maßgeschneiderte ggplot2 Diagramme

Data Science 1 - Programmieren & Visualisieren

Saskia Otto

Universität Hamburg, IMF

Wintersemester 2023/2024

Lernziele

Am Ende dieser VL- und Übungseinheit werden Sie

  • die Standardeinstellungen und -skalen der verschiedenen Aesthetics wie Farbe, Form, Grösse bei ggplot2 Grafiken ändern können.
  • Teilmengen von Daten auf verschiedene Felder einer Grafik aufteilen können.
  • Koordinatensysteme anpassen können, um z.B. Tortendiagramme, Polardigramme bzw. Coxcomb-Plots oder Karten zu erstellen.
  • Beschriftungen und Legenden anpassen können.
  • das Gesamtlayout und einzelne Layoutelemente verändern können.
  • einen ersten Einblick in die Erstellung einfacher geografischer Karten mit ggplot2 bekommen.

Maßgeschneiderte Grafiken

Der Datensatz | Komplett

Datensatz ist im Paket ‘marinedata’ enthalten:

# Laden des Datensatzes zur Ostsee (Baltic Sea) Hydrografie 2015
data(bshydro15, package = "marinedata")
str(bshydro15)
tibble [61,149 × 15] (S3: tbl_df/tbl/data.frame)
 $ cruise     : chr [1:61149] "????" "????" "????" "????" ...
 $ station    : chr [1:61149] "0002" "0002" "0002" "0002" ...
 $ lat        : num [1:61149] 55.1 55.1 55.1 55.1 55.1 ...
 $ long       : num [1:61149] 10.8 10.8 10.8 10.8 10.8 ...
 $ ices_sd    : Factor w/ 13 levels "IIIa","22","23",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ sampling_id: int [1:61149] 1 1 1 1 1 1 2 2 2 2 ...
 $ date_time  : POSIXct[1:61149], format: "2015-01-05 08:17:00" "2015-01-05 08:17:00" ...
 $ year       : int [1:61149] 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
 $ month      : Factor w/ 12 levels "Jan","Feb","Mar",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ day        : int [1:61149] 5 5 5 5 5 5 5 5 5 5 ...
 $ bot_depth  : int [1:61149] 12 12 12 12 12 12 10 10 10 10 ...
 $ pres       : num [1:61149] 0.2 1 5 10 11.3 11.9 0.2 1 5 8.9 ...
 $ temp       : num [1:61149] 4.9 4.89 4.89 4.91 4.91 4.95 4.28 4.4 4.5 5.28 ...
 $ psal       : num [1:61149] 24 24 24 24.1 24.1 ...
 $ doxy       : num [1:61149] 5.34 5.34 5.34 5.4 5.4 5.4 5.29 5.29 5.19 5 ...

Der Datensatz | Transformiert

Schrittweise Berechnung der gemittelten SST (0-5m) pro Sampling in den Sommermonaten:

sst_sum <- bshydro15 |> 
  # Filtern der Sommermonate und Oberflächenmessungen (0-5m)
  filter(pres <= 5,  month %in% c("May", "Jun", "Jul", "Aug")) |> 
  # Gruppierung nach Variablen die Sampling definieren
  group_by(station, lat, long, date_time, month, day) |> 
  # Bildung des Temperaturmittelwerts über die 5m 
  summarise(temp = mean(temp, na.rm = TRUE)) |> 
  ungroup() |> 
  # Hinzufügen des Probezeitraums
  mutate(
    hour = lubridate::hour(date_time), # Extrahiert die Stunde
    sampling = case_when(         # Bildet Kategorien basierend auf den Stunden
      hour >= 6 & hour < 21 ~ "day",
      TRUE ~ "night")
  )

Zur Erinnerung | Die 8 grafischen Ebenen

Voreinstellungen überschreiben

p1 <- ggplot(sst_sum, aes(long, lat)) +
  geom_point(aes(colour = temp, shape = month))
str(p1)

ggplot2 - ‘Aesthetics’

Visuelle Eigenschaften der Elemente

Aesthetics

  • Sie können einen Punkt auf verschiedene Weisen darstellen, in dem Sie Werte den Attributen (‘aesthetics’) zuordnen:
  • size, shape, colour (Farbe bzw. Konturfarbe), fill (Füllfarbe)
  • Zuweisung:
  • lokal (geom_* Funktionen) vs. global (ggplot())
  • einheitlich/manuell vs. Variablen-spezifisch (innerhalb von aes())
  • Sobald Sie ein ‘aesthetic’ zuweisen, macht ‘ggplot2’ den Rest
  • und wählt eine vernünftige Skala aus,
  • konstruiert eine Legende.
  • Für x und y ‘aesthetics’ erstellt ggplot2 keine Legende aber Achsenlinien mit Beschriftung.

Übersicht

  • x
  • y, ymin, ymax
  • colour
  • fill
  • alpha
  • size
  • shape
  • linetype
  • stroke
  • group
  • weight
  • width
  • hjust, vjust
  • label
  • angle
  • family, fontface, lineheight
  • lower, middle, upper
  • ..

Aesthetics | Wertezuweisung

Einheitlich

ggplot(sst_sum, aes(long, lat)) +
  geom_point(colour = "red")

Variablen-spezifisch

ggplot(sst_sum, aes(long, lat)) +
  geom_point(aes(colour = sampling))

Farbe

Spezifikation

  • Farbe ist das beliebteste Attribut nach der Position.
  • Sie kann spezifiziert werden mit
    • einem Namen, z.B. “red”. R hat 657 eingebaute, benannte Farben, die aufgelistet werden können mit colours().
    • einer RGB Spezifikation als Hex-Code in der Form “#RRGGBB”
    • Eine gute Übersicht der Farben und ihrer Hex-Codes findet sich auf dieser Website: https://www.color-hex.com/

Beispiel mit 4 Farben

col_df <- data.frame(x = 1:4, y = 1:4)
ggplot(col_df, aes(x, y)) +
  geom_point(size = 7,
    colour = c("blue4", "grey60", 
      "#556B2F", "#8B7355"),
  )

Ein DSB Cheatsheet zu R Farben gibt es auch auf Moodle bzw. auf der GitHub Repository uham-bio/Cheatsheets

Farbe | colour, fill, alpha

Kontur- vs. Füllfarbe

Für einige Grundelemente kann man 2 Farbattribute wählen: die Konturfarbe (colour) und die Füllfarbe (fill)

ggplot(bshydro15, aes(x = month)) +
  geom_bar(aes(colour = month),
    fill = "white")

Transparenz

Um Farben transparent zu machen das Attribut alpha verwenden → Bereich von 0 (transparent) bis 1 (opaque=deckend).

col_df <- data.frame(x = 1:5, y = 1:5)
ggplot(col_df, aes(x, y)) +
  geom_point(colour = "red", size = 7,
    alpha = c(.1,.3,.5,.7,1.0))

Linien- und Punkttypen

Linientyp | linetype

Übersicht

… können spezifiziert werden mit einem Namen oder einer Zahl von 0-6:

Code
labels <- rev(c("blank = 0", 
  "solid = 1", "dashed = 2",
  "dotted = 3", "dotdash = 4",
  "longdash = 5","twodash = 6")
)
lty <- 6:0
linetypes <- data.frame(
  y = seq_along(lty), 
  lty = lty
)
ggplot(linetypes, aes(0, y)) +
  geom_segment(aes(xend = 5,
    yend = y, linetype = lty)) +
  scale_linetype_identity() +
  geom_text(aes(label = labels),
    hjust = 0, nudge_y = 0.2,
    size = 6) +
  scale_x_continuous(NULL, 
    breaks = NULL) +
  scale_y_continuous(NULL,
    breaks = NULL) 

iris Beispiel

ggplot(iris,
  aes(Petal.Length, Petal.Width)) +
  geom_point() +
  geom_smooth(method = "lm", 
    se = FALSE,
    linetype = 2)


Punktform | shape

Übersicht der 25 Punkteformen

Die voreingestellte Form hat die Nummer 19.

Code
shapes <- data.frame(
  shape = 24:0,
  x = rep(5:1, 5), 
  y = rep(1:5, each = 5)
)

ggplot(shapes, aes(x, y)) +
  geom_point(aes(shape = shape),  
    size = 8, fill = "red") +
  geom_text(aes(label = shape),
    hjust = 0, nudge_x = 0.15) +
  scale_shape_identity() +
  expand_limits(x = 4.1) +
  scale_x_continuous(NULL,
    breaks = NULL) +
  scale_y_continuous(NULL,
    breaks = NULL)

iris Beispiel

ggplot(iris,
  aes(Petal.Length, Petal.Width)) +
  geom_point(shape = 4)

Text

Schriftart und -stärke | family, fontface

Übersicht

  • Mit dem Attribut family wird die Schriftart definiert:
    • sans’ (default), ‘serif’, ‘mono’.
  • Mit dem Attribut fontface wird die Textstärke definiert:
    • normal (‘plain’), kursiv (‘italic’), fett (‘bold’)
Code
df <- data.frame(x = 1, y = 3:1,
  family = c("sans", "serif", "mono"),
  fontface = c("plain", "italic", "bold"))
df$label <- paste0("'", df$family, 
  "' und '", df$fontface, "'")
ggplot(df, aes(x, y)) + ylim(0,4) +
  geom_text(aes(label = label,
    family = family, fontface = fontface),
    size = 6) +
  theme(
    axis.title = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    panel.grid = element_blank(),
    plot.background =  element_blank()
  )

iris Beispiel

ggplot(iris,
  aes(Petal.Length, Petal.Width)) +
  geom_point() +
  annotate("text", x = 3, y = 0.4,
    label = "I. setosa",
    colour = "red", size = 6,
    family = "serif", fontface = "italic")


Ausrichtung | hjust, vjust

Übersicht

Zur horizontalen (hjust) und vertikalen (vjust) Ausrichtung des Bezugspunkt zum Label (!)

  • nutzen Sie eine Zahl zwischen 0 und 1
  • oder eine Zeichenfolge.
  • vjust: 1 = ‘top’, 0.5 = ‘middle’, 0 = ‘bottom
  • hjust: 0 = ‘left’, 0.5 = ‘center’, 1 = ‘right
Code
just <- expand.grid(hjust = c(0,0.5,1),
  vjust = c(0, 0.5, 1))
hjust_txt <- rep(c("left", "center", 
  "right"), 3)
vjust_txt <- rep(c("bottom", "middle", 
  "top"), each = 3)
just$label <- paste0(hjust_txt, "/", 
  vjust_txt)

ggplot(just, aes(hjust, vjust)) +
  geom_point(colour = "grey70",
    size = 5) +
  geom_text(aes(label = label,
    hjust = hjust, vjust = vjust),
    size = 5) 

mtcars Beispiel

ggplot(data = mtcars, aes(wt, mpg,
  label = rownames(mtcars))) +
  geom_point() +
  geom_text(colour = "turquoise3",
    vjust = 0, hjust = 0)

Your turn …

00:30

Quiz 1-2 | Aesthetics

Q1 | Punktgröße

Es soll ein sog. Blasenplot (‘bubble plot’) erstellt werden, sprich ein Streudiagramm bei dem die Größe der Punkte abhängig ist von einer dritten, quantitativen Variable (‘z’).

Mögliche Codeschnipsel
ggplot(df, aes(x, y), size = z) +
  geom_point()

ggplot(df, aes(x, y)) +
  geom_point(aes(size = z))

ggplot(df, aes(x, y)) +
  geom_point(size = z)

Q2 | Farbe und Form nach Art getrennt

Folgendes Diagramm soll erstellt werden:

Codeversuch zur Rekonstruktion
ggplot(iris,
    aes(x = Species, y = Petal.Width)) +
  geom_point(colour = Species, 
    shape = Species, alpha = 0.5)

ggplot2 - ‘Scales’

Verwendung von Skalen

Scales

  • Um die Voreinstellung eines Attributs zu verändern verwenden Sie eine Skala, die zu dem Attribut passt (bei Variablen-spezifischer Zuweisung mit aes()):
    • aesthetic mapping = Welche Variable kartiere ich mit z.B. Farbe
    • scale = Wie kartiere ich eine Variable mit z.B. Farbe
  • Verwende die dreiteilige Namenskonvention und füge weitere Argumente zur Skalenfunktion hinzu, falls gewünscht (z.B. name für einen Legendennamen):

Übliche Skalen

Positionsskalen für quantitative Variablen

  • scale_x_continuous()
    Standardskala für kontinuierliche x-Werte.
  • scale_x_log10()
    → Abbildung von x auf einer log10-Skala.
  • scale_x_reverse()
    Dreht die Achsenausrichtung um.
  • scale_x_sqrt()
    → Abbildung von x auf einer Quadratwurzelskala.
  • xlim(), ylim(), lims()
    → Stellt Achsenbegrenzungen ein.

(tausche x einfach gegen y)

Für viele Attribute

lassen sich die Skalenfunktionen

  • scale_XXX_manual()
  • scale_XXX_identity()
  • scale_XXX_discrete()
  • scale_XXX_continuous()
  • scale_XXX_binned()

verwenden.

Positionsskala

Log10-Transformation

→ Was ist der Hauptunterschied?

Transformation der XY-Variablen

ggplot(iris, aes(
  x = log10(Petal.Length), 
  y = log10(Sepal.Length))) +
  geom_point()

Transformation der XY-Skalen

ggplot(iris, aes(x = Petal.Length, 
  y = Sepal.Length)) +
  geom_point() +
  scale_x_log10() + scale_y_log10()


Sekundärachse

Hier ein Beispiel, wo scale_x_reverse() und scale_x_continuous() in Kombination mit sec_axis() für eine Sekundärachse sehr praktisch sind:

Beispiel Tiefenprofil

Code
bshydro15 |> 
  filter(station == "0508", day == 5,
    month == "Aug") |> 
  ggplot(aes(y = pres)) +
  geom_path(aes(x = temp), col = "red") +
  geom_path(aes(x = psal), col = "blue") +
  # Variable der Sekundärachse anpassen:
  geom_path(aes(x = doxy*2), col="green") +
  scale_y_reverse() +
  scale_x_continuous(
    sec.axis = sec_axis(
      ~./2, # = Primärachse (.) durch 2
      name="doxy"))

Farbskala - Standardeinstellungen | 1

Qualitative Variablen

Die Voreinstellung von ‘ggplot2’ bei Variablen vom Typ character oder factor ist (in Abhängigkeit davon wieviele Farben benötigt werden):

Quantitative Variablen

Die Voreinstellung von ‘ggplot2’ bei Variablen vom Datentyp integer oder double ist:

Farbskala - Standardeinstellungen | 1

ggplot2 erkennt automatisch, ob Variablen qualitativ oder quantitativ sind:

Code
iris |> 
ggplot(aes(Sepal.Length, Petal.Length)) +
  geom_point(aes(colour = Species))

Code
iris |> 
  mutate(Species2 = case_when(
    Species == "setosa" ~ 1,
    Species == "versicolor" ~ 2,
    TRUE ~ 3)
  ) |> 
ggplot(aes(Sepal.Length, Petal.Length)) +
  geom_point(aes(colour = Species2))

Farbskala - Überblick aller Funktionen

Qualitative Farbskalen | 1

p <- ggplot(sst_sum, aes(x = long, y = lat, colour = month)) + 
  geom_point()

Standard bei qualitativer Variable

p

Manuelle Anpassung der Farbskala → scale_colour_manual()

p + 
  scale_colour_manual(values = c("red","blue","grey30","green3"))

Darstellung in Graustufen → scale_colour_grey()

p + 
  scale_colour_grey(name = "Month") # Legendentitel

Qualitative Farbskalen | 2

ColorBrewer

Die ‘brewer’ Palette in scale_colour_brewer() bietet schöne Farbschemata von ‘ColorBrewer’, die speziell für Karten gefertigt wurde: http://colorbrewer2.org

Mit folgendem Befehl wird eine Liste jeder ‘brewer’ Palette aufgerufen:

library(RColorBrewer)
par(mar=c(0,3,0,0)) # reduziert Rand
display.brewer.all()

scale_colour_brewer()

Qualitative Farbskalen | 3

Anpassung der Füllfarbe

iris |> 
  group_by(Species) |> 
  summarise(Sepal.Length.Mean = mean(Sepal.Length)) |> 
  ggplot(aes(x = Species, y = Sepal.Length.Mean)) +
  geom_col(aes(fill = Species)) +
  scale_fill_brewer(palette = "Paired")

Quantitative Farbskalen

Standardeinstellung

p <- ggplot(sst_sum, aes(x = long, y = lat,
    colour = temp)) +  geom_point()
p + scale_colour_gradient(
  low = "#132B43", high = "#56B1F7")

2-/3/n-Farbgradient

  • scale_colour_gradient() ist die voreingestellte Farbskala. Sie erzeugt einen Gradienten von niedrig zu hoch (siehe rechten Plot).
  • scale_colour_gradient2() erzeugt einen auseinanderlaufen Farbverlauf mit 3 Farben (niedrig//mittel/hoch) und ist besonders zum Setzen von Kontrasten geeignet.
  • scale_colour_gradientn() erzeugt einen Gradienten mit n Farben.


scale_colour_gradient()

Von gelb zu rot

p + scale_colour_gradient(
  low = "yellow", high = "red")

Fehlende Werte in gelb

p + scale_colour_gradient(
  low = "white", high = "maroon4",
  na.value = "yellow")


scale_colour_gradient2()

2-Farbgradient mit midpoint

p + scale_colour_gradient2(midpoint = 10)

2-Farbgradient mit midpoint und Farben

p + scale_colour_gradient2(midpoint = 15,
  low = "blue", mid = "yellow",
  high = "red", na.value = "black")

Anpassung der Formskala von Punkten

scale_shape_manual() bei qualitativen Variablen

p <- ggplot(sst_sum, aes(long, lat)) + geom_point(aes(shape = month))

Es lassen sich eigentlich nur qualitative Variablen (vom Typ ‘character’ oder ‘factor’) dem Attribut shape zuweisen.

Standardformen

p

Anpassung

p + scale_shape_manual(
  values = 0:3)  


scale_shape_identity() bei diskreten Variablen

  • Wenn eine diskrete Variable Werte zwischen 0 und 25 beinhaltet (entspricht den Formwerten), kann ggplot2 die Variable dem Attribut shape zuordnen
    • → wenn die Funktion scale_shape_identity() hinzugefügt wird (ansonsten gibt es eine Fehlermeldung).
  • Es wird allerdings keine Legende erstellt!

Die Julitage 1-25 in untersch. Formen

filter(sst_sum, month == "Jul", day<26) |> 
ggplot(aes(long, lat)) +
  geom_point(aes(shape = day)) +
  scale_shape_identity()

Größenskala quantitativer Variablen

Mögliche Funktionen

Das Größenattribut wird am häufigsten für Punkte und Text verwendet. Variablen-spezifische Zuweisungen lassen sich modifizieren mit:

  • scale_size() → skaliert Fläche
  • scale_size_area() → stellt sicher, dass ein Wert von 0 mit einer Größe von 0 abgebildet wird
  • scale_size_binned() / scale_size_binned_area() → gebinnte Version

Standardskala am Beispiel SST im Juni

p <- filter(sst_sum, month == "Jun") |> 
  ggplot(aes(long,lat)) +
  geom_point(aes(size = temp), alpha = 0.3)
p

Die Verwendung transparenter Farben (mit dem ‘alpha’ Attribut) zeigt sehr gut überlappende Punkte!


Anpassung mit scale_size()

p + scale_size(name = "Temperature",
  range = c(0,5), # Spannweite Punktgröße
  breaks = seq(5,20,2.5)) # Wertebereiche

scale_size_binned_area()

p + scale_size_binned_area(
  name = "Temperature")

Funktionsübersicht für Skalen

Es gibt Skalen für jedes Attribut, das von ‘ggplot2’ verwendet wird. Um eine komplette Liste mit Beispielen zu sehen siehe https://ggplot2.tidyverse.org/reference/#scales

Bildschirmfoto der Website (aufgenommen Jan. 2022)

Your turn …

00:30

Quiz 3-4 | Scales

Q3 | Farbskala

Farbanpassung im Streudiagramm
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point(aes(colour = Species)) +
  scale_colour_gradient(low = "yellow", high = "red")

Q4 | Grössenskala

Beim sog. Blasenplot (‘bubble plot’) soll die Größenskala angepasst werden. Und zwar sollen die Größenstufen in 1er-Schritten von 2 bis 10 gehen.

Mögliche Codeschnipsel
ggplot(df, aes(x, y)) +
  geom_point(aes(size = z)) +
  scale_size(breaks = seq(2,10,1))

ggplot(df, aes(x, y)) +
  geom_point(aes(size = z)) +
  scale_size(range = seq(2,10,1))

ggplot(df, aes(x, y)) +
  geom_point(aes(size = z)) +
  scale_size(limits = seq(2,10,1))

ggplot2 - ‘Faceting’

Faceting

facet_wrap(), facet_grid()

Was ist das?

  • Die sog. ‘facet’ Funktionen unterteilen eine Grafik in verschiedene Felder basierend auf den Werten einer oder mehrerer qualitativer Variablen.
  • Jedes Feld (‘panel’) visualisiert dadurch nur eine Teilmenge der Daten.
  • Nützlich zur Untersuchung von Interaktionen zwischen Variablen.

Trennung der Samplings nach Tag/Nacht

p <- ggplot(sst_sum, aes(x=long,y=lat)) + 
  geom_point()
p + facet_wrap(~sampling, nrow = 1)

Faceting | Labels anpassen

Um die Label der ‘facets’ anzupassen, verwende das Argument labeller:

Trennung der Samplings nach Tag/Nacht und Monat

p + facet_grid(sampling ~ month, labeller = label_both)

Faceting | Übersicht

Your turn …

00:30

Quiz 5-6 | Faceting

Q5 | Nach 1 Variable aufteilen

Ein Streudiagramm soll entsprechend einer kategorialen Variable (‘z’) in Teildiagramme (‘facets’) aufgeteilt werden. Diese Teildiagramme sollen dabei in einer Spalte angeordnet werden.

Mögliche Codeschnipsel
ggplot(df, aes(x, y)) +
  facet_wrap(~ z)

ggplot(df, aes(x, y)) +
  facet_wrap(~ z, ncol = 1)

ggplot(df, aes(x, y)) +
  facet_wrap(~ z, nrow = 1)

Q6 | Nach 2 Variablen aufteilen

CO2 |> 
  ggplot(aes(x = conc, y = uptake)) +
  geom_point() +
  geom_smooth() +
  facet_grid(Type ~ Treatment, 
    labeller = label_both)

ggplot2 - Koordinatensysteme

Anpassung des Koordinatensystems

Kurz erklärt

  • Ein Koordinatensystem (KS) dient zur eindeutigen Bezeichnung der Position von Punkten und Objekten in einem geometrischen Raum.
  • Das gebräuchlichste KS ist das kartesische.
  • Mit einigen der coord_XXX() Funktionen kann das KS aber angepasst werden, OHNE dabei die Daten zu verändern!
  • Verwenden Sie die zweiteilige Namenskonvention:

Funktionen

  • coord_cartesian()
    → Kartesisches Koordinatensystem (KS).
  • coord_fixed()
    → Kartesisches KS mit festem “Seitenverhältnis”
  • coord_flip()
    → Kartesisches KS mit verdrehter X- und Y-Achse
  • coord_trans()
    → Transformiertes kartesisches KS
  • coord_polar()
    → Polarkoordinaten
  • coord_sf()
    → Für geometrische (sf) Objekte
  • coord_map()(), coord_quickmap()
    → Kartenprojektionen

Randbereich des KS entfernen

pks <- ggplot(mtcars, aes(disp, wt)) + geom_point() + geom_smooth()

Standardeinstellung

pks

expand = FALSE

pks + coord_cartesian(expand=FALSE)

Zoomen auf KS- vs. Skalen-Ebene

Anpassung von X im KS

pks + coord_cartesian(
  xlim = c(325, 500))

Das Setzen der Achsengrenzen im Koordinatensystems verändert nicht die Daten, sondern ist wirklich nur als Zoomen zu betrachten. Die Glättungskurve hat sich für diesen Ausschnitt nicht verändert.

Anpassung der X-Skala

pks + scale_x_continuous(
  limits = c(325, 500))

Das Setzen der Achsengrenzen auf der Skalenebene wandelt alle Werte außerhalb des Bereichs in NA um. Entsprechend sieht die Glättungskurve für diesen Bereich anders aus, als im größeren Ausschnitt!

Shortcut für die X-Skala

pks +
  xlim(325, 500)

Kurzhand-Notation für scale_x_continuous()

Daten- vs. KS-Transformation

  • ggplot2 Funktionen für KS-Transformationen erlauben eine Veränderung der Positionierung der Elemente im Koordinatensystem, ohne die Daten zu modifizieren.
  • Dies kann eine andere Aussage bei der Visualisierung bewirken:

Ohne Transformation

Code
data(mammals, package = "MASS")
ggplot(mammals, 
  aes(x = body, y = brain)) + 
  geom_point()

Transformation der Variablen

Code
ggplot(mammals, 
  aes(x = log(body), 
      y = log(brain))) +
  geom_point()

Transformation des KS

Code
ggplot(mammals, 
  aes(x = body, y = brain)) + 
  geom_point() + 
  coord_trans(x = "log",
    y = "log")

KS-Anpassungen | Beispiele

Projektion von Karten | coord_map()

coord_map() projiziert einen Ausschnitt der annähernd kugelförmigen Erde auf eine flache 2D-Ebene mit Hilfe einer Projektion, die durch das Paket ‘mapproj’ definiert ist.

Die Weltkarte
world <- map_data("world")
worldmap <- ggplot(world, 
  aes(x = long, y = lat)) +
  geom_polygon(aes(group = group), 
    fill = "white", colour = "black")
worldmap

Orthographische Projektion
worldmap + 
  coord_map("ortho", orientation = c(55,20,0))

Hinein-Zoomen in die Ostsee

Fügen Sie einfach den Bereich der Längen- und Breitengrade als Achsengrenzen zu coord_map() hinzu:

Ausschnitt der Ostsee

worldmap + 
  coord_map("ortho", orientation = c(55, 20, 0),
  xlim = c(10, 30), ylim = c(54,66))

Your turn …

00:30

Quiz 7-8 | Koordinatensystem

Q7 | Standard-KS


Q8 | KS anpassen

mtcars |> 
  ggplot(aes(x = factor(cyl))) +
  geom_bar(aes(fill = factor(cyl)), 
    width = 1) +
  coord_polar()

ggplot2 - Diagramme aufpeppen: Labels, Legenden und Themes

Beschriftungen (‘labels’)

Allgemeines

  • Gute Beschriftungen sind wichtig für die Erstellung von verständlichen Diagrammen.
  • Beschriftungen für Achsen (‘axis’) und Legenden (‘legend’) sollten den ganzen Namen der Variable oder eine übliche Abkürzung zeigen.
  • Der Titel und Untertitel sollte das Hauptthema bzw. die Hauptergebnisse beinhalten.

Funktionen

  • xlab(), ylab()
    → Ändert Achsentitel.
  • ggtitle()
    → Fügt Titel (und Untertitel) hinzu.
  • labs()
    → Ändert Achsen-, Legenden- und Plotbeschriftungen.

Beschriftungen | Beispiel

Sommertemperaturen Ostsee

p1 <- ggplot(sst_sum, aes(long, lat)) + geom_point(aes(colour = temp, shape = month)) + 
  scale_colour_gradient(low = "white", high = "red") +
  labs(x = "Longitude", y = "Latitude", colour = "SST", shape = "Month", # alle Aesthetics
    title = "Thermal patterns in the Baltic Sea", 
    subtitle = "SST (0-5m) in summer 2015")
p1

Legenden (‘guides’)

Allgemeines

Es gibt verschiedene Möglichkeiten, die Legende für Variablen-spezifische Attribute anzupassen:

  • Innerhalb der ‘scale’ Funktionen (guide Argument)
  • Dezentral mit guides() → Für jedes Attribut kann mittels Helferfunktion die Legende angepasst werden.

‘guides’ Helfer

  • guide_none()
    → Zeigt keine Legende für das entsprechende Attribut.
  • guide_axis()
    → Passt die Achsenbeschriftung an (für x und y).
  • guide_colourbar()
    → Anpassung der colour und fill Legende
  • guide_coloursteps
    → Eine gebinnte Version von guide_colourbar().
  • guide_legend()
    → Anpassung für alle anderen Attribute.
  • guide_bins()
    → Eine gebinnte Version von guide_legend().

Legenden | Beispiel

Sommertemperaturen Ostsee

p2 <- p1 + 
  guides(
    colour = guide_colourbar(title = "SST (in °C)", order = 2),
    shape = guide_legend(title = "Summer months", order = 1, title.position = "bottom",
      nrow = 2, byrow = TRUE)
  )
gridExtra::grid.arrange(p1, p2, nrow = TRUE)

Themes

Themes

Allgemeines

  • Das Wort ‘theme’ kommt aus dem Englischen und steht für eine veränderbare grafische Oberflächengestaltung.
  • Man kann sich darunter spezielle Layoutvorlagen vorstellen.
  • ‘ggplot2’ bietet mehrerer solcher Vorlagen an, die über die theme_XXX() Funktionen genutzt werden können.
  • Einzelne Elemente im ausgewählten ‘theme’ können dann noch über die theme() Funktion verändert werden.

9 Themes

  • theme_gray()
  • theme_dark()
  • theme_bw()
  • theme_linedraw()
  • theme_light()
  • theme_minimal()
  • theme_test()
  • theme_classic()
  • theme_void()

Das Design der 9 themes

Code
dp <- p2 + guides(colour = "none", shape = "none")
t1 <- dp + theme_dark() + ggtitle("theme_dark")
t2 <- dp + theme_gray() + ggtitle("theme_gray")
t3 <- dp + theme_bw() + ggtitle("theme_bw")
t4 <- dp + theme_linedraw() + ggtitle("theme_linedraw")
t5 <- dp + theme_light() + ggtitle("theme_light")
t6 <- dp + theme_minimal() + ggtitle("theme_minimal")
t7 <- dp + theme_test() + ggtitle("theme_test")
t8 <- dp + theme_classic() + ggtitle("theme_classic")
t9 <- ggplot() + theme_void() # leerer Plot
t10 <- dp + theme_void() + ggtitle("theme_void")
gridExtra::grid.arrange(grobs = list(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10), nrow = 2)

Designvorlagen externer Pakete

‘ggthemes’ von Jeffrey Arnold

‘ggtech’ von Ricardo Bion

  • https://github.com/ricardo-bion/ggtech
  • ‘ggtech’ bietet ‘themes’, die Google, Airbnb, Twitter, Facebook gleichen.
  • Evtl. müssen einige Schriftarten vorab manuell installiert werden!
  • devtools::install_github('ricardo-bion/ggtech', dependencies = TRUE)

Beispiele von ‘ggthemes’

Code
library(ggthemes)
gp <- p2 + guides(colour = "none", shape = "none")
t1 <- gp + theme_excel()  + ggtitle("theme_excel")
t2 <- gp + theme_economist()  + ggtitle("theme_economist")
t3 <- gp + theme_solarized()  + ggtitle("theme_solarized")
t4 <- gp + theme_tufte() + ggtitle("theme_tufte")
t5 <- gp + theme_gdocs()  + ggtitle("theme_gdocs")
t6 <- gp + theme_wsj()  + ggtitle("theme_wsj")
t7 <- gp + theme_base()  + ggtitle("theme_base")
t8 <- gp + theme_fivethirtyeight()  + ggtitle("theme_fivethirtyeight")

gridExtra::grid.arrange(grobs = list(t1,t2,t3,t4,t5,t6,t7,t8), nrow = 2)

Anpassung einzelner Elemente

theme()

Eine lange Liste von Theme-Komponenten

In der Hilfe bzw. Funktionsdokumentation finden Sie eine Übersicht über alle Komponenten, die Sie in der Funktion anpassen können:

Änderung der Legendenposition

Legende unterhalb der Plotfläche

p2 + theme_classic() +
  theme(legend.position = "bottom",
  legend.justification = "left")

Legende innerhalb der Plotfläche

p2 + theme_classic() +
  theme(legend.position = c(0.2, 1.01),
  legend.justification = c("left", "top"),
  legend.box.just = "left")

Änderung der Schriftgröße

Anpassung aller Schriftelemente

p2 + theme_classic() +
  theme(text = element_text(size = 15))

Anpassung der Achsenbeschriftung

p2 + theme_classic() +
  theme(axis.text=element_text(size=25))

Your turn …

01:00

Quiz 9-11 | Guides & Themes

Q9 | Legende entfernen

Wie kann die von ggplot2 automatisch erstellte Legende im Blasenplot (‘bubble plot’) wieder entfernt werden?

Mögliche Codeschnipsel
ggplot(df, aes(x, y)) +
  geom_point(aes(size = z)) +
  guides("none")

ggplot(df, aes(x, y)) +
  geom_point(aes(size = z)) +
  guides(size = guide_none())

ggplot(df, aes(x, y)) +
  geom_point(size = z) +
  guides(size = "none")

Q10 | Legende für Farbe und Form anpassen

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point(aes(shape = Species, colour = Petal.Width)) +
  guides(
    colour = guide_colourbar(
      order = 2, label.position = 'right'),
    shape = guide_legend(
      order = 1, label.position = 'left')
  )

Q11 | Einzelelemente im Layout ändern

bshydro15 |> 
  ggplot(aes(x = month)) +
  geom_bar() +
  theme(
    axis.text.x = element_text(angle = 45),
    axis.line = element_line(colour = 'grey50'),
    panel.background = element_blank()
    )

Kommen wir zurück zum eigentlichen Ziel…

Linke Abbildung

Der Code
library(ggplot2) 
# oder: library(tidyverse)
p1 <- ggplot(sst_sum, aes(long, lat)) +
  geom_point(aes(colour = temp, 
    shape = month))
p1

Rechte Abbildung

Der Code
library(ggplot2) # oder: library(tidyverse)
world <- map_data("world")
worldmap <- ggplot(world, aes(x = long, y = lat)) +
  geom_polygon(aes(group = group), 
    fill = "ivory3", colour = "black")
baltic <- worldmap + coord_map("ortho",  
    xlim = c(10, 30), ylim = c(54,66))

p2 <- baltic + 
  geom_point(data = sst_sum, 
    aes(x = long, y = lat, colour = temp), size = 1) +
  scale_colour_gradient(low = "white", high = "red") +
  facet_wrap(~month) +
  labs(x = "Longitude", y = "Latitude",
    title = "Thermal pattern in the Baltic Sea",
    subtitle = "SST in the summer months of 2015") +
  guides(colour = guide_colourbar(title = "SST (in °C)")) +
  ggthemes::theme_base() +
  theme(
    legend.position = "bottom", 
    legend.title.align = 1,
    legend.title=element_text(colour ="red", angle = 0),
    panel.background = element_rect(fill = "lightblue1")
  )
p2

Übungsaufgabe

Übungsskripte und Fallstudiendaten

  • Lösen Sie die Übungsskripte (in Moodle verfügbar) und
  • probieren Sie sich mit den ggplot2 Diagramme ihrer Fallstudie aus, ändern Sie viele der Standardeinstellungen und versuchen Sie mal die erste Karte zu erstellen.

Optionale Swirl-Lektionen zur Vertiefung

Kurs DSB-04-Datenvisualisierung mit ggplot2

  • L08-Aesthetics_und_deren_Skalierung
  • L09-Facets
  • L10-Koordinatensysteme
  • L11-Labels_und_Guides
  • L12-Themes
  • L14-Karten erstellen mit ggplot2

Wie fühlen Sie sich jetzt…?

Total konfus?


Dann empfehle ich Ihnen:

Total gelangweilt?

Dann testen Sie doch Ihr Wissen in den folgenden Quizfragen..

Abschlussquiz | daphnia

Quiz 1

ggplot(daphnia,
  aes(x = treatment, y = offspring)) +
  geom_boxplot(aes(fill = treatment))

Quiz 2

ggplot(daphnia,
  aes(x = treatment, y = offspring)) +
  geom_boxplot(aes(fill = treatment)) +
  scale_fill_manual(name = 'Treatment',
    values = c('yellow', 'orange'))

Quiz 3

ggplot(daphnia,
  aes(x = treatment, y = offspring)) +
  geom_boxplot(aes(fill = treatment)) +
  scale_fill_manual(name = 'Treatment',
    values = c('yellow', 'orange')) +
  facet_grid(pop ~ .)

Quiz 4

ggplot(daphnia,
  aes(x = treatment, y = offspring)) +
  geom_boxplot(aes(fill = treatment)) +
  scale_fill_manual(name = 'Treatment',
    values = c('yellow', 'orange')) +
  facet_grid(pop ~ .) +
  coord_flip()

Quiz 5

ggplot(daphnia,
  aes(x = treatment, y = offspring)) +
  geom_boxplot(aes(fill = treatment)) +
  scale_fill_manual(name = 'Treatment',
    values = c('yellow', 'orange')) +
  facet_grid(pop ~ .) +
  coord_flip() +
  ggtitle(label = 'Populations differences') +
  ylab('Total number of offsprings') +
  xlab('Treatment') +
  theme_bw()

Bei weiteren Fragen: saskia.otto(at)uni-hamburg.de

Creative Commons License
Diese Arbeit is lizenziert unter einer Creative Commons Attribution-ShareAlike 4.0 International License mit Ausnahme der entliehenen und mit Quellenangabe versehenen Abbildungen.