Aufgaben 3

Aufgabe 3.1: Grundlagen R

  1. Geben Sie eine möglichst einfache Funktion / Operation an mit der Sie die folgenden Vektoren erstellen können.

    • Eine Zahlenfolge von 100 bis 250 in 3er Schritten.
    • 30 mal die 5 und danach 20 mal eine 7.
    • 17 äquidistante Zahlen zwischen 10 und 15.
    • Die Zahlenfolge (4, 7, 12) sechs mal hintereinander.
    • Die Zahlen 4, 7 und 12 jeweils sechs mal hintereinander.
  2. Erklären Sie die Ausgaben der folgenden Zeilen. Überlegen Sie sich vor dem Ausprobieren wie das Ergebnis aussehen könnte.

c("Auto", TRUE, 1)
c(5, 2, 1, TRUE, FALSE)
rep(c(4,5,6), c(1,2,3))
rep(1:4, each = 3)
1 + 1:2 + 1:4 + 1:8

Aufgabe 3.2: Graph einer Funktion 1

In dieser Aufgaben sollen Sie Graphen von mathematischen Funktionen mit R erzeugen. Gegeben sind die Funktionen

\[ f(x) = \sin(x), \quad g(x) = \cos(x), \quad \text{und} \quad h(x) = \frac{1}{x}. \]

  1. Erstellen Sie mit R einen Graphen für die Funktionen \(f\) und \(g\) in einem geeigneten Intervall, so dass von jeder der Funktionen mindestens eine komplette Periode zu sehen ist.
  • Die beiden Graphen sollen verschiedene Farben haben und mit einer dickeren Strichstärke als der Standard gezeichnet sein.
  • Finden Sie ferner heraus wie man die Achsenbeschriftung derart ändert, dass halbzahlige und ganzzahlige Vielfache von \(\pi\) an den Achsen stehen.
  1. Zeichnen Sie die Funktion \(h\) im Intervall von \([-4, 4]\). Worauf muss man achten?

Aufgabe 3.3: Graph einer Funktion 2

In dieser Aufgaben sollen Sie Graphen von mathematischen Funktionen mit R erzeugen.

Gegeben sind die drei Funktionen

\[\begin{aligned} f(x) = \mathrm{e}^x, \qquad g(x) = \ln(x), \end{aligned}\]

sowie die Winkelhalbierende \(h(x) = x\).

  1. Erstellen Sie eine Datentabelle mit der Sie die obigen Funktionen im Intervall \([-3, 3]\) mit ggplot2 darstellen können.
  2. Erstellen Sie nun eine Grafik in der die Graphen aller drei Funktionen zu sehen sind.
  3. Färben Sie die Graphen und zeichen sie diese mit einer etwas dickeren Strichstärke als dem Standard.
  4. Schauen Sie sich nun die erzeugte Datentabelle an. Was fällt auf?

Der Logarithmus ist die Spiegelung der Exponenatialfunktion an der Winkelhalbierenden, da es Umkehrfunktionen voneinender sind. In der Grafik, die Sie eben erstellt haben ist das aufgrund der Skalierung (die \(y\)-Achse ist gestaucht) nicht zu sehen.

  1. Mit welcher Funktion (aus dem ggplot-Unmiversum) können Sie die Koordinaten nun so zurechtschneiden, dass das Koordinatensystem in \(x\)- wie \(y\)-Richtung die gleiche Dimension hat (z.B. jeweils von -3 bis 3)?

Aufgabe 3.4: Farben in R

In R gibt es viele Möglichkeiten die Farben von Grafiken zu verändern. Die wichtigste wird durch das Paket colorspace zur Verfügung gestellt, das eine Vielzahl von wichtigen Farbpaletten bereitstellt. Dies soll jedoch später in einer eigenen Aufgabe besprochen werden.

Farben werden durch Zeichenketten der Form #RRGGBB bzw. #RRGGBBAA repräsentiert, wobei RR für einen Rotwert, GG für einen Grünwert und BB für einen Blauwert stehen. Das nicht notwendige, aber mögliche AA steht für einen Alphawert, der die Transparenz kodiert. Alle Werte werden im Hexadezimalsystem angegeben, das heißt sie gehen von 00 bis FF.

# Pakete laden:
library(pacman)
p_load(tidyverse, patchwork)
g1 <- mpg |> ggplot(aes(x = cty, y = hwy)) + 
               geom_point(color = "#0000FF") # blau

g2 <- mpg |> ggplot(aes(x = displ, y = hwy)) + 
               geom_point(color = "#FF000033") # rot transparent

g3 <- mpg |> ggplot(aes(x = displ, y = cty)) + 
               geom_point(color = "#FFAA00") # orange

(g1|g2|g3)

  • Vordefinierte Farben:
    In R gibt es 657 vordefinierte Farben, die einen Namen haben. Diese finden Sie im R Color Cheat Sheet (moodle). Alle Farbnamen kann man mit der folgenden Funktion sichtbar machen:

    colors() # insgesamt 657 Farbnamen, 502 verschiedene
    colors()[1:12] # die ersten 12:
     [1] "white"         "aliceblue"     "antiquewhite"  "antiquewhite1"
     [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine"   
     [9] "aquamarine1"   "aquamarine2"   "aquamarine3"   "aquamarine4"  

    In der folgenden Grafik sind alle vordefinierten Farben zu sehen. Die Zahl an der \(x\)-Achse entspricht der Stelle im Vektor colors().

  • Die Funktion rgb():

    Mit Hilfe der Funktion rgb(), was für red, green, blue steht, können Farben auf einfache Weise generiert werden: die Argumente der Funktion sind red, green, blue, alpha, names = NULL und maxColorValue = 1. Diese können vektoriell verwendet werden, um eine ganze Palette von Farben zu erzeugen. Dabei variieren nun die Werte standardmäßig zwischen 0 und 1, können aber aber durch Ändern des Arguments maxColorValue auch zwischen 0 und einem beliebigen anderen Wert (oft wird der Wert 255 verwendet) variieren.

    Durch diese Parametrisierung erhält man einen Farbwürfel, dessen Ecken und Kanten im Bild rechts zu sehen sind. Die Diagonale, bei der die R-,G- und B-Werte jeweils gleich sind, enthält die Grautöne.

  • die Funktion hsv():

    Analog zur Funktion rgb() können mit der Funktion hsv(), was für hue, saturation, value steht, Farben definiert werden. Die Argumente der Funktion sind h = 1, s = 1, v = 1, sowie alpha, der Transparenz. Alle Argumente sind Zahlenwerte aus dem Intervall \([0, 1]\). Im Gegensatz zum RGB-Farbraum sind der HSV-Farbraum und auch der HCL-Farbraum auf die Wahrnehmung des Menschen ausgelegt. Diese beiden Farbräume eignen sich daher deutlich besser für Grafiken.

  • die Funktion hcl():
    Auch mit der Funktion hcl(), was für hue, color, luminance steht, können Farben definiert werden. Die Argumente der Funktion sind h = 0 aus \([0, 360]\), c = 35, l = 85 aus \([0, 100]\), alpha aus \([0, 1]\), der Transparenz und fixup = TRUE. Welchen Wert c annehmen kann, hängt von h und l ab. Das Paket colorspace basiert auf dem HCL-Farbraum und bietet optimale Werkzeuge um Farbpaletten zu erzeugen.

  1. Welche Farben werden in den Vektoren r1 und r2 erzeugt?

    (r1 <- rgb(seq(0, 1, 0.1), 0, 1))
     [1] "#0000FF" "#1A00FF" "#3300FF" "#4D00FF" "#6600FF" "#8000FF" "#9900FF"
     [8] "#B300FF" "#CC00FF" "#E600FF" "#FF00FF"
    r2 <- rgb(seq(0,1,0.1), seq(0,1,0.1), seq(0,1,0.1))

    Überlegen Sie sich das Ergebnis anhand der Grafik zu den RGB-Farben.

  2. Erzeugen sie mit der Funktion hsv() jeweils einen Blau- und einen Gelbton. Variieren Sie das Argument v von 0 bis 1 und stellen Sie das Ergebnis in einer einfachen Grafik dar, zum Beispiel

    barplot(1:12, col = 1:12)

    wobei natürlich die erzeugten Farben gewählt werden sollen.

  3. Wie erzeugt man mit hsv() die Grautöne?

Für die kommenden Aufgaben benötigen Sie das Paket DA.students.

  1. Erzeugen Sie mehrere Farbvektor mit zwei nicht zu saturierter Farben. Erstellen Sie nun einen Boxplot bei dem das Geschlecht auf der \(x\)-Achse und die Anzahl der Schuhe auf der \(y\)-Achse aufgetragen werden. Färben Sie die Boxplots mit den von Ihnen generierten Farben.

    Nutzen Sie sowohl die vordefinierten Farben als auch die Funktionen rgb().

  2. Was macht die Funktion rev()? Inwiefern hilft Ihnen das ggf. bei der Vergabe von Farben?

Bemerkungen:

  • Sowohl der HSV- als auch der HCL-Farbraum orientieren sich beide an der Wahrnehmung des Auges und sind daher prinzipiell besser für Grafiken geeignet, insbesondere wenn (kontinuierliche) Farbpaletten benötigt werden.

  • Für einfache Grafiken (zum Beipspiel einfach gefärbte Graphen, ggf. transparente einfarbige Streudigramme, ist auch die Funktion rgb() gut geeignet.

  • Häufig kommt es insbesondere bei kategorialen Daten vor, dass man Farbpaletten braucht, wobei nicht ohne weiteres klar ist, wie viele Farben benötigt werden (zum Beispiel Anzahl der Automarken im mpg-Datensatz oder die Anzahl der Wohnformen im dat.studenten-Datensatz, etc.). Hier ist es notwendig einen anderen Weg zur Änderung der Farben zu wählen. Dies geschieht in der nächsten Aufgabe!

Aufgabe 3.5: Farbpaletten in R

Farben spielen bei der Visualisierung von Daten eine wichtige Rolle. Oft wird dabei allerdings vergessen warum man Farbe verwendet. Der wesentliche Grund ist, dass Grafiken für den Betrachter durch die Farbe besser lesbar und damit verständlicher werden sollen. Farben sollten nicht primär dazu dienen die Graphik hübscher oder bunter zu machen! Die Wahl einer geeigneten Farbpalette kommt damit eine, oft unterschätzte, aber wichtige Bedeutung zu.
In R gibt es viele Pakete, die Farbpaletten zur Verfügung stellen. Das vermutlich beste Paket ist colorspace, aber auch RColorBrewer und einige kleinere Pakete wie viridis oder auch wesanderson bieten brauchbare Farbpaletten.
In dieser Aufgabe sollen Sie sich explizit mit dem Paket colorspace auseinandersetzen.

Das Paket colorspace stellt drei verschiedene Arten von Farbpaletten zur Verfügung: qualitative, sequentielle mit einer oder mehreren Farben, sowie divergierende:

Verwendet wird hier der HCL-Farbraum, was für Hue, Chroma und Luminance, also Farbton, Farbsättigung und Farbhelligkeit steht. Der Vorteil dieser Paletten ist, dass diese ausgezeichnet geeignet sind um ‘Abstände’ in metrischen Daten farblich zu visualisieren (mit einer Regenbogenpalette oder einfachen RGB-Farben geht das nicht). Ferner ist der HCL-Farbraum sehr gut geeignete um Farbpalette für Menschen mit Farbfehlsichtigkeiten, zum Beispiel Protanopie und Deuteranopie zu erzeugen, was immerhin 8% aller Männer betrifft.

Im Moodle finden Sie einen ausführlichen Artikel von den Autoren des Pakets colorspace zu HCL-Farben.

  1. Überlegen Sie sich jeweils ein geeignetes Szenario in denen man

    • qualitative,
    • sequentielle,
    • divergierende

    Farbpaletten benutzen sollte.

Um eine solche Farbpalette zu generieren kann man die Palette sowie die Anzahl der Farben angeben:

# Pakete laden:
library(pacman)
p_load(colorspace)
q1 <- qualitative_hcl(5, palette = "Dark 3") # 5 qualitative Farben
q1
[1] "#E16A86" "#AA9000" "#00AA5A" "#00A6CA" "#B675E0"

und analog mit den Funktionen sequential_hcl() und diverging_hcl(). Um eine Farbpaletten des Pakets colorspace mit ggplot2 zu benutzen, verwendet man die die folgende Syntax:

scale_<aesthetic>_<skalentyp>_<palettentyp>()

Dabei ist

  • <aesthetic> der Name der Aesthetic, die geändert werden soll: fill, color oder colour,
  • <skalentyp> der Skalentyp des Merkmals: discrete, continuous oder binned und
  • <palettentyp> die Art der Farbpalette: qualitative, sequential, diverging oder divergingx.
p_load(tidyverse, patchwork) # patchwork: Anordnung der Graphiken

g1 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) + 
        geom_density(alpha = 0.6) +
        scale_fill_discrete_qualitative(palette = "Dark 3") 

g2 <- ggplot(iris, aes(x = Species, y = Sepal.Width, color = Sepal.Length)) + 
        geom_jitter(width = 0.1, alpha = 0.6) +
        scale_color_continuous_sequential(palette = "Terrain")

(g1|g2)

  1. Betrachten Sie den Studenten-Datensatz dat.studenten. Überlegen Sie sich für die jeweiligen Merkmale, ob diese diskret oder kontinuierlich sind und welche Skalenpalette man für eine einfache Darstellung vermutlich wählen würde.

  2. Im Folgenden sehen Sie zwei Beispiele für eine divergierende Skala. Was zeigen die Graphiken und warum ist es sinnvoll hier eine divergierende Palette zu nehmen?
    Bemerkung: Mit der Funktion mutate() kann man ein neues Merkmal in seiner Datentabelle erstellen.

    p_load(DA.students)
    
    g3 <- dat.studenten |> 
            mutate(MW = (AlterV + AlterM) - mean(AlterV + AlterM, na.rm = T)) |> 
            ggplot(aes(x = AlterV - Alter, y = AlterM - Alter, color = MW)) + 
              geom_jitter() + 
              scale_color_continuous_diverging(palette="Red-Green") + 
              theme_bw()
    
    
    g4 <- dat.studenten |> 
             mutate(MW = (AlterV-AlterM) - mean(AlterV-AlterM, na.rm = T)) |> 
             ggplot(aes(x = AlterV- Alter, y = AlterM - Alter, color = MW)) + 
               geom_jitter() + 
               scale_color_continuous_diverging(palette="Blue-Red") + 
               theme_bw()
    (g3|g4)

  3. Auf dem ersten Aufgabenblatt wurde ein Säulendiagramm mittels des folgenden Codes erzeugt:

    dat.studenten |> ggplot(aes(x = Geschlecht, fill = Wohnform)) +
                     geom_bar(position = "dodge")

    Erstellen Sie nun ein Balkendiagramm aus diesen Daten und ändern sie die Färbung mit einer geeigneten Farbpalette aus dem Paket colorspace.

Tipps:

  • Um eine eigene, angepasste Farbpalette zu generieren, gibt es die sehr praktische Funktion

    choose_palette()

    die eine interaktive Oberfläche öffnet bei der man nicht nur selbst Farbpaletten generien kann, sondern auch Simulationen sehen kann, wie Menschen mit bestimmten Sehschwächen, diese Farbpaletten wahrnehmen oder wie die Paletten ohne Farbe (zum Beispiel bei einem Schwarz-Weiß-Ausdruck) aussehen würden.

  • Nutzen Sie das hier erworbene Wissen und versuchen Sie es bei den zukünftigen Aufgaben anzuwenden!