Maßgeschneiderte ggplot2 Diagramme

Data Science 1 - Programmieren & Visualisieren

Saskia Otto

Universität Hamburg, IMF

Wintersemester 2022/2023

Lernziele

Am Ende dieser Vorlesung und Übungseinheit sollten 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"),
  )

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

Formtypen | 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)

Linientypen | 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)

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

Text - 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: Aesthetics

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)

Quiz 2: Aesthetics

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

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

→ Was ist der Hauptunterschied?

Positionsskala | 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

Farbskala - Manuelle Zuweisung

scale_colour_manual()

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

Standard bei qualitativer Variable

p

Anpassung der Farbskale

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

Qualitative Farbskalen | 1

scale_colour_grey()

Darstellung in Graustufen

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

Qualitative Farbskalen | 3

scale_colour_brewer()

Qualitative Farbskalen | 4

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 | 1

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.

Standardeinstellung

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

Quantitative Farbskalen | 2

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

Quantitative Farbskalen | 3

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)  

Formskala bei diskreten Variablen

scale_shape_identity()

  • 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 | 1

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!

Größenskala quantitativer Variablen | 2

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: Scales - 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")

Quiz 4: Scales - 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,20,2.5))

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

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

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: Faceting

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)

Quiz 6: Faceting | CO2

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

Tortendiagramme mit coord_polar()

Im Buch ‘Grammar of Graphics’ wird ein Tortendiagram als ein gestapeltes Säulendiagramm mit polaren Koordinaten definiert:


Anzahl an Samplings pro Monat

monthly_pie <- bshydro15 |> 
  select(sampling_id, month) |> 
  distinct() |> 
  mutate(year = "y")

ggplot(monthly_pie, aes(year)) +
  geom_bar(aes(fill = month)) +
  scale_fill_brewer(palette="Paired") +
  coord_polar(theta="y", direction=-1)

Was jetzt nötig ist, ist das Aufräumen einiger Elemente… (siehe nächstes Kapitel)!

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, group = group)) +
  geom_polygon(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: Koordinatensystem

Quiz 8: Koordinatensystem | CO2

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)

Zurück zum Tortendiagramm

Damit unser Plot auch wirklich aussieht wie ein typisches Tortendiagramm, nutzen wir die minimalistische Layoutvorlagen, die ggplot2 anbietet: theme_void()

Urprüngliche Grafik

Code
pie_chart1 <- ggplot(monthly_pie, 
  aes(year, fill = month)) + 
  geom_bar() +
  scale_fill_brewer(palette="Paired") + 
  coord_polar(theta="y", direction=-1)
pie_chart1

Ohne Legende und Layoutelemente

pie_chart1 + 
  guides(fill = "none") +
  theme_void()

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: Guides

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

Quiz 10: Guides

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')
  )

Quiz 11: Themes

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

Zu bearbeitende Swirl-Lektionen

Kurs DSB-04-Datenvisualisierung mit ggplot2

  • L08-Aesthetics_und_deren_Skalierung
  • L09-Facets
  • L10-Koordinatensysteme
  • L11-Labels_und_Guides
  • L12-Themes

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 1

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

Abschlussquiz | daphnia 2

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

Abschlussquiz | daphnia 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 ~ .)

Abschlussquiz | daphnia 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()

Abschlussquiz | daphnia 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.