Weitere Geoms und Aufbereiten von Plots

Linienplots mit geom_line()

Minimalbeispiel geom_line()

d <- tibble(A = c(1, 2, 3, 5), B = c(2, 6, 4, 4.5))
ggplot(data = d) + geom_line(mapping = aes(x = A, y = B))

  • geom_line() funktioniert im Prinzip genau wie geom_point()

BIP Länder (erster Versuch)

ggplot(data = d_wb_countries) + 
  geom_line(mapping = aes(x = year, y = gdp))

  • Nicht klar, dass nur Punkte derselben Länder verbunden werden sollen!

BIP Länder (zweiter Versuch)

ggplot(data = d_wb_countries) + 
  geom_line(mapping = aes(x = year, y = gdp, group = country))
Warning: Removed 64 rows containing missing values or values outside the scale range
(`geom_line()`).

  • Mit group = <M> angegeben, welche Punkte zusammengehören

BIP Länder (mit Farbe)

ggplot(data = d_wb_countries) + 
  geom_line(mapping = aes(x = year, y = gdp, color = country, group = country))
Warning: Removed 64 rows containing missing values or values outside the scale range
(`geom_line()`).

  • Einfärben mit color = c

BIP Länder: Farbe und Population

ggplot(data = d_wb_countries) + geom_line(
    mapping = aes(x = year, y = gdp, color = country, linewidth = pop), lineend = "round")
Warning: Removed 64 rows containing missing values or values outside the scale range
(`geom_line()`).

  • size = s legt Linienstärke fest
  • lineend = "round" bei sehr dicken Linien

Was es sonst nocht gibt…

Liniensegmente mit geom_segment()

ggplot(data = d_wb_countries_2012) +
  geom_segment(mapping = aes(x = 0, xend = pop, y = country, yend = country)) +
  geom_point(mapping = aes(x = pop, y = country), color = "red")

  • Notwendige AES: x, y, xend, yend, auch mit festen Werten

Rechtecke mit geom_tile()

d <- data.frame(X = c(0,1,3), Y = c(3,2,1), W = c(1,0.5,1), H = c(2,3,1))
ggplot(data = d) +
  geom_tile(mapping = aes(x = X, y = Y, width = W, height = H)) +
  geom_point(mapping = aes(x = X, y = Y), color = "red")

  • Notwendige AES: Mittelpunkt und Breite/Höhe
  • tile wie Fliese

Rechtecke mit geom_rect()

d <- data.frame(X1=c(0,1.5,3), Y1=c(2.5,2,1), X2=c(1,2.5,3.5), Y2=c(1,3,2))
ggplot(data = d) +
  geom_rect(mapping = aes(xmin = X1, ymin = Y1, xmax = X2, ymax = Y2)) +
  geom_point(mapping = aes(x = X1, y = Y1), color = "red") + geom_point(mapping = aes(x = X2, y = Y2), color = "blue")

  • Notwendige AES: Koordinaten der Eckpunkte
  • rect wie rectangle = Rechteck

Plots aufbereiten

Facetten mit facet_wrap

ggplot(data = filter(d_ns_bochum_tag, Jahr %in% 2014:2017)) +
  geom_boxplot(mapping = aes(x = Monat, y = NS)) +
  facet_wrap(~Jahr, ncol = 2)                                  

  • facet_wrap(~Merkmal): Für jede Ausprägung des Merkmals ein Plot
  • facet wie Facette, Seite und wrap wie umbrechen
  • Anzahl der Zeilen (row) oder Spalten (col) mit nrow = nr oder ncol = nc
  • Jahre 2014 - 2017 mit filter() (später, Verweis)

Sortierung nach Häufigkeit 1/3

ggplot(d_wb_all) + geom_bar(mapping = aes(x = region))

  • Standardmäßig wird alphabetisch sortiert

Sortierung nach Häufigkeit 2/3

ggplot(d_wb_all) + geom_bar(mapping = aes(x = fct_infreq(region)))

  • Nach Häufigkeit sortieren mit fct_infreq()
  • fct wie factor = Faktor und infreq wie in frequency order = der Häufigkeit nach sortiert

Sortierung nach Häufigkeit 3/3

ggplot(d_wb_all) + geom_bar(mapping = aes(x = fct_rev(fct_infreq(region))))

  • Ansteigend mit fct_rev()
  • rev wie reverse = umgekehrt

Sortierung nach Merkmal 1/3

ggplot(d_wb_countries) + geom_col(mapping = aes(x = country, y = pop))

  • Standardmäßig wird alphabetisch sortiert

Sortierung nach Merkmal 2/3

ggplot(d_wb_countries) + geom_col(mapping = aes(x = fct_reorder(country, pop), y = pop))

  • Nach Merkmal sortieren mit fct_reorder()

Sortierung nach Merkmal 3/3

ggplot(d_wb_countries) + geom_col(mapping = aes(x = fct_rev(fct_reorder(country, pop)), y = pop))

  • Absteigend sortieren wieder mit fct_rev()

Skalen

Skalen regeln die Abbildung von Daten auf die Eigenschaften geometrischer Objekte (AES).

Form der Angaben zu Skalen: scale_AAA_BBB(<Arguments>)

AAA BBB
x,y continuous, discrete
x,y reverse, sqrt, log10
color, fill grey, hue, manual, brewer, …

Darüber hinaus gibt es Skalen für alle anderen visuellen Eigenschaften (Transparenz, Linientyp, Shape, …). In der Regel muss man diese aber nicht anpassen.

Skalen werden automatisch eingefügt

Werden keine Skalen angegeben (so wie bisher), dann fügt ggplot automatisch sinnvolle Skalen ein. Aus

ggplot(data = d_wb_all) + 
  geom_point(mapping = aes(x = year, y = gdp))

wird daher

ggplot(data = d_wb_all) + 
  geom_point(mapping = aes(x = year, y = gdp)) +
  scale_x_continuous() + 
  scale_y_continuous()

Skalen anpassen: Selber dazuschreiben

Kontinuierliche Achsen: Achspunkte ändern

ggplot(data = d_wb_all) + geom_point(mapping = aes(x = year, y = gdp)) +
  scale_x_continuous(breaks = c(1965, 1990, 2015))
Warning: Removed 2915 rows containing missing values or values outside the scale range
(`geom_point()`).

  • Änderung der Beschriftung mit breaks = b

Kontinuierliche Achsen: Möglichkeiten

Argument Beschreibung
breaks Vektor mit Werten für Achspunkte
minor_breaks Vektor mit Werten für zwischen-Achspunkte
limits Vektor mit zwei Elementen für Begrenzung
labels Vektor mit Beschriftung (selten)

  • Keine Punkte mit breaks = NULL bzw. minor_breaks = NULL
  • Durch limits werden die entsprechenden Daten vor dem Plotten entfernt (manchmal nicht erwünscht). Alternativ die Plotgrenzen bei coord_cartesian() angeben (gleich)

Diskrete Achsen: Beschriftung ändern

ggplot(data = d_wb_2012) + geom_bar(mapping = aes(x = region)) +
  scale_x_discrete(labels = c("A", "B", "C", "D", "E", "F", "G"))

  • Änderung der Beschriftung mit labels = l

Viele Werte nah am Ursprung

ggplot(data = d_wb_2012) +
  geom_point(mapping = aes(x = gdp, y = gge, fill = region, size = pop), shape = 21)
Warning: Removed 42 rows containing missing values or values outside the scale range
(`geom_point()`).

  • Problem: Fast alle Werte liegen sehr nahe bei Null

Viele Werte nah am Ursprung: Logarithmische Skala

ggplot(data = d_wb_2012) +
  geom_point(mapping = aes(x = gdp, y = gge, fill = region, size = pop), shape = 21) +
  scale_x_log10() + scale_y_log10()
Warning: Removed 42 rows containing missing values or values outside the scale range
(`geom_point()`).

  • Bereich wird für kleine Werte aufgezogen, für große Werte komprimiert

Weitere Skalen für Achsen

Element Wirkung
scale_x_sqrt(), scale_y_sqrt() Wurzelskala
scale_x_log10(), scale_y_log10() Logarithmische Skala
scale_x_reverse(), scale_y_reverse() Umgedrehte Skala

→ Definitionsbereich von Logarithmus und Wurzel beachten

Kontinuierliche Farbskala

Datensatz: Sinuskurve

d <- tibble(X = seq(0, 2, by=0.05), Y = sin(pi*seq(0, 2, by=0.05)))

Beispiel (nicht empfohlen)

ggplot(data = d) + geom_col(mapping = aes(x = X, y = Y, fill = Y)) +
  scale_fill_gradient(low = "green", high = "red")

  • scale_fill_gradient() erzeugt Farbverlauf mit zwei Farben

Beispiel (auch nicht empfohlen)

ggplot(data = d) + geom_col(mapping = aes(x = X, y = Y, fill = Y)) +
  scale_fill_gradient2(low = "orange", mid = "yellow", high = "green")

  • scale_fill_gradient2() erzeugt Farbverlauf mit drei Farben

Brewer-Farbpalette (empfohlen)

ggplot(data = d) + geom_col(mapping = aes(x = X, y = Y, fill = Y)) +
  scale_fill_distiller(palette = "RdBu")

  • Farbpalette von Cynthia Brewer (gleich mehr dazu)

Farbskala umgekehrt

ggplot(data = d) + geom_col(mapping = aes(x = X, y = Y, fill = Y)) +
  scale_fill_distiller(palette = "RdBu", direction = 1)

  • direction = 1 zeigt die Skala so an, wie sie definiert ist, Voreinstellung ist umgedreht

Mit diskreten Farbwerten

ggplot(data = d) + geom_col(mapping = aes(x = X, y = Y, fill = Y)) +
  scale_fill_fermenter(palette = "RdBu")

Mit logarithmischer Skala

ggplot(data=mutate(d,Y=Y^16+1e-9))+geom_col(mapping=aes(x=X, y=Y, fill=Y))+
  scale_y_log10() + scale_fill_fermenter(palette = "RdBu", trans = "log10")

  • Viele Werte sehr klein wegen Y^16. Daher: Logarithmische Skalen
  • Farben mit trans = "log10" dem Logarithmus der Werte zuordnen

Definierte Farbskalen (kontinuierlich)

Element Argumente
scale_AAA_gradient low, high
scale_AAA_gradient2 low, mid, high
scale_AAA_distiller palette
scale_AAA_fermenter palette

→ Für AAA je nach Anwendung entweder ‘color’ oder ‘fill’ einsetzen

Optionen für alle kontinuierlichen Farbskalen

Option Mögliche Werte Funktion
direction 1, -1 Farbskala umkehren
guide “colourbar”, “legend” Kontinuierliche Skala oder diskrete Farben
trans “idendity”, “log10”, … Transformation für Werte

Diskrete Farbskala manuell (erster Versuch)

d <- data.frame(farbe = c("rot", "gruen", "blau", "gruen", "rot", "gruen"))
ggplot(data = d) + geom_bar(mapping = aes(x = farbe, fill = farbe)) +
  scale_fill_manual(values = c("red", "blue", "green"))

  • Zuordnung quasi zufällig

Diskrete Farbskala manuell (zweiter Versuch)

d <- data.frame(farbe = c("rot", "gruen", "blau", "gruen", "rot", "gruen"))
ggplot(data = d) + geom_bar(mapping = aes(x = farbe, fill = farbe)) +
  scale_fill_manual(values=c("rot"="red", "blau"="blue", "gruen"="green"))

  • Zuordnung mit Ausprägung = Farbe angeben

Brewer-Farbpalette

ggplot(data = d_wb_2012) + geom_bar(mapping = aes(x=region, fill=region)) +
  scale_fill_brewer(palette = "Set1")

Brewer-Farbpaletten

  • Kontinuierlich: scale_color_distiller(palette = p) oder scale_fill_distiller(palette = p)
  • Diskret: scale_color_brewer(palette = p) oder scale_fill_brewer(palette = p)

Brewer-Farbpaletten

  • Entwickelt von Cynthia Brewer
  • Kartographin an der Penn State Universität
  • http://colorbrewer2.org

Beschriftungen

Beschriftung mit labs()

ggplot(data = d_ns_bochum_monat) + 
  geom_histogram(mapping = aes(x = NS), binwidth = 15, boundary = 0) +
  labs(                                               
    title = "Histogramm Niederschlag in Bochum", subtitle = "1951 - 2017", 
    x = "Monatlicher Niederschlag (mm)", y = "Anzahl der Monate",
    caption = "Quelle: Deutscher Wetterdienst"
  )

Beschriftung der Farblegende

ggplot(data = d_wb_2012) + geom_bar(mapping = aes(x=region, fill=region)) +
  labs(fill = "Region der Welt")

  • Legende ebenfalls mit labs beschriften
  • Zum Beispiel für die Füllfarbe: fill = Titel

Beschriftung entfernen

ggplot(data = filter(d_ns_bochum_monat, Jahr >= 2000)) +
  geom_boxplot(mapping = aes(x = factor(Jahr), y = NS)) +
  labs(x = NULL, y = NULL)

  • Wert NULL entfernt die Beschriftung und den dafür reservierten Platz

Beschriftung drehen

  ggplot(data = d_wb_2012) + geom_bar(mapping = aes(x=region, fill=region)) +
    guides(x = guide_axis(angle = 45))

  • Erste Möglichkeit, wenn Beschriftungen auf x-Achse zu lang
  • Geschmackssache

Beschriftung versetzen

  ggplot(data = d_wb_2012) + geom_bar(mapping = aes(x=region, fill=region)) +
    guides(x = guide_axis(n.dodge = 3))

  • Zweite Möglichkeit, wenn Beschriftungen auf x-Achse zu lang
  • Auch Geschmackssache

Koordinatensysteme

Achsen vertauschen mit coord_flip()

ggplot(data = d_wb_2012) + geom_bar(mapping = aes(x=region, fill=region)) +
  coord_flip()

  • Vertauscht die x-Achse mit der y-Achse

Plotbereich mit coord_cartesian()

ggplot(data = d_wb_countries) + 
  geom_ribbon(mapping = aes(x=year, ymin=0, ymax=gdp, color=country, fill=country), alpha = 1/3) +
  coord_cartesian(xlim = c(1980, 2010), ylim = c(0, 4e12))
Warning: Removed 74 rows containing missing values or values outside the scale range
(`geom_ribbon()`).

  • Bereich festlegen: xlim = c(xmin, xmax) und ylim = c(ymin, ymax)

Polarkoordinaten mit coord_polar()

ggplot(data = d_wb_countries) + 
  geom_ribbon(mapping = aes(x=year, ymin=0, ymax=gdp, color=country, fill=country), alpha = 1/3) +
  coord_polar(theta = "y")
Warning: Removed 74 rows containing missing values or values outside the scale range
(`geom_ribbon()`).

  • Ein Wert wird zum Radius, der andere zum Winkel
  • Variable ("x" oder "y") für Winkel mit theta

Tortendiagramm (Wiederholung)

ggplot(data = d_wb_countries_2012) +
  geom_col(mapping = aes(x = 0, y = gge, fill = country), color = "black", width = 1) +
  coord_polar(theta = "y") + theme_void()

  • Gestapeltes Balkendiagramm wird zum Tortendiagramm
  • theme_void() entfernt Dekoration (gleich)

Ringdiagramm (Wiederholung)

ggplot(data = d_wb_countries_2012) +
  geom_col(mapping=aes(x = 0.5, y = gge, fill = country), color = "black", width = 1) +
  scale_x_continuous(limits = c(-1, 1)) + coord_polar(theta = "y") + theme_void() 

  • Bereich der x-Achse anpassen
  • theme_void() entfernt Dekoration (gleich)

Themes

Voreinstellungen für Graphiken anpassen

Erscheinungsbild anpassen mit theme()

  ggplot(data = d_wb_2012) + geom_bar(mapping = aes(x=region, fill=region)) +
    theme(
      panel.background = element_rect(fill = "pink"), 
      panel.grid.major = element_line(color = "hot pink")
    )

  • Alle Plot-Elemente lassen sich mithilfe von theme() anpassen
  • Insgesamt ca. 80 Einstellungsmöglichkeiten
  • Tipp: Nicht zuviel Zeit damit verbringen

Voreingestellte Themes

  • Vernünftige Voreinstellungen
  • theme_void() entfernt alles
  • Weitere Themes im Paket ggthemes

Globale Einstellungen zu Beginn des Dokuments. Beispiel:

theme_set(theme_bw())

Farben ändern

Nicht allen gefallen die grauen Balken…

Farben für einzelnen Plot setzen

ggplot(data = d_ns_bochum_monat) + 
  geom_histogram(mapping = aes(x = NS), fill = "orange", color = "black")

Problem: Viel Arbeit, wenn die Plots einheitlich aussehen sollen

Besser: Voreinstellungen global ändern

line_color <- "black"
fill_color <- "light blue"
update_geom_defaults("bar",   list(fill = fill_color, color = line_color))
update_geom_defaults("point", list(fill = fill_color, color = line_color))
update_geom_defaults("boxplot", list(fill = fill_color))

# und so weiter

  • Einstellungen für alle Plots zu Beginn des Dokuments
  • Lässt sich später einfach ändern

Farben angeben

Mit dem Namen einer Farbe

  • Zum Beispiel "red" (mehr als 600 vordefinierte Farben)
  • colors() gibt Namen der vordefinierten Farben
  • http://sape.inf.usi.ch/quick-reference/ggplot2/colour

Mit RGB-Wert

  • Zum Beispiel rgb(0, 0.7, 1)

Mit Hex-Wert

  • Zum Beispiel "#45e32f"
  • Farben in R standardmäßig als Hexadezimalzahl

Legenden entfernen

Methode 1: Legende für einzelne Skala

ggplot(data = d_wb_2012) +
  geom_point(mapping = aes(x=gdp, y=gge, color=region, size=pop)) +
  scale_x_log10() + scale_y_log10() +
  scale_size(guide = "none")
Warning: Removed 42 rows containing missing values or values outside the scale range
(`geom_point()`).

  • Argument guide = "none" für die Skala
  • Farbskala entfernen mit scale_color_discrete(guide = "none" (PRÜFEN!!))

Methode 2: Alle Legenden für ein Geom

ggplot(data = d_wb_2012) +
  geom_point(mapping=aes(x=gdp, y=gge, color=region, size=pop), 
    show.legend = FALSE) +
  scale_x_log10() + scale_y_log10()
Warning: Removed 42 rows containing missing values or values outside the scale range
(`geom_point()`).

  • Argument show.legend = FALSE entfernt alle Legenden für ein Geom