Plotten mit baseR und ggplot2

Der letzte Teil dieser (ziemlich vollen) ersten Woche handelt von einfachen Abbildungen. Generell in der desktiptiven Statistik ist es ofte gut, sich Daten zu visualisieren. Dies macht man mittels verschiedenster Abbildungen. Einige haben Sie schon in der Vorlesung kennengelernt, und im Laufe Ihres Studiums werden Sie verschiedenste Varianten kennenlernen. In R, gibt es vielfältige Möglichkeiten um solche Plots zu erstellen. Wie Sie sich vorstellen können, gibt es verschiedenste Implementierungen - in diesem Kurs werden wir die Funktionen des baseR-Pakets vorstellen; uns aber mehr und mehr auf die Nutzung des Pakets ggplot2 konzentrieren. Dieses hat erhebliche Funktionalitätsvorteile und ist auch designmäßig deutlich ausgereifter als andere Pakete. Zuletzt übernimmt das Paket schon viele Designelement und kann im Prinzip beliebig modifiziert werden.

Wir fangen an, indem wir nochmals unseren Vektor mit den Daten aus dem Klimagarten und der Dachstation laden, und in einem Data Frame überführen.

garten <- c(283.3, 285.6, 286.1, 286.7, 287.0, 288.2, 284.4, 284.6, 283.2, 284.1, 284.1, 282.2, 283.5, 285.2, 287.7, 288.9, 290.5, 287.8, 284.2, 281.5, 284.6, 287.6, 287.4, 288.2, 286.7, 285.1, 287.4, 289.4, 289.8, 288.4, 286.3)
dach <- c(283.5, 285.6, 286.1, 286.8, 287.1, 288.4, 284.9, 284.8, 283.6, 284.4, 284.6, 282.9, 283.8, 285.6, 287.8, 289.3, 290.8, 288.1, 284.4, 281.6, 284.5, 287.8, 287.5, 288.4, 286.9, 285.5, 287.7, 289.7, 290.1, 289.2, 287.0)

# Erstellen des Data frames und anpassen einer Datumsspalte
df <- data.frame(garten, dach)
df <- df - 273.15
df$datum <- seq(as_date("2023-10-01"), as_date("2023-10-31"), "1 day")

Plotten im Paket baseR

Das Plotten in baseR ist ziemlich intuitiv. Man initialisiert einen Plot und fügt dann einzelne Elemente hinzu. Für unser Beispiel wollen wir für die Dachstation zunächst ein Punkt- dann ein Liniendiagramm erstellen.

#Graph für Klimagarten
plot(x=df$datum, y=df$garten, pch = 20, col = 'blue', xlab = '2023', ylab = 'Temperatur [Grad Celsius]')
#Daten für Dachstation drüber plotten
points(x=df$datum, y=df$dach, pch = 20, col = "red")
# Titel 
title('Mittlere Tagestemperaturen')
# Legende erstellen
legend('bottomright', c('Adlershof Klimagarten', 'Adlershof Dachstation'), col = c('blue', 'red'), pch = 20)

Sehr kompliziert ist dies nicht. Wie in den Kommentaren innerhalb des R-Codes beschrieben, erstellen wir mit plot() zunächst einen ersten Plot. Da wir ein xy-Diagram erstellen, müssen wir definieren, welche Werte auf die jeweilige Variable kommt. Sinnhaft ist hier lediglich dass datum die x-Variable, und garten die y-Variable ist. Anschließend haben wir uns noch manuell um die Legende sowie den Titel gekümmert. Alternativ - und möglicherweise sinnhafter - ist die Erstellung eines Liniendiagrams. Diese erfolgt fast analog, wir müssen lediglich ein paar kleine Modifikationen vornehmen: in der Zeile plot() sagen wir R mittels des Parameters type="l", dass wir anstelle eines Punnktdiagrams ein Liniendiagram haben wollen. Anschließend erstellen wir mittels lines() (statt points()) die zweite Linie:

#Graph für Klimagarten
plot(x=df$datum, y=df$garten, pch = 20, col = 'blue', 
     xlab = '2023', ylab = 'Temperatur [Grad Celsius]',
     type = 'l', lwd = 1.5) # erstellt einen Linienplot)
#Daten für Dachstation drüber plotten
lines(df$datum, y=df$dach, pch = 20, col = "red")
# Titel 
title('Mittlere Tagestemperaturen')
# Legende erstellen
legend('topleft', 
       c('Adlershof Klimagarten', 'Adlershof Dachstation'), 
       col = c('blue', 'red'), lty = 1, lwd = 1.5)

Hier sehen Sie schon die “power”, die das Arbeiten mit R mit sich bringt: mittels kleiner Veränderungen - konkret das Setzen von type="l" bzw. die Nutzung von lines() - ergbit ohne größere Mühe eine andere Diagramart. Dies sollte schon jetzt motivieren, solche Abbildungen in Zukunft mit R zu machen.

Wie beschrieben, wollen wir den obigen Graph jedoch auch mit dem moderneren ggplot2-Paket erstellen. Für den obigen Fall des Diagrams ist die grundsätzliche Idee sehr ähnlich: wir initialisieren einen Graph und plotten dann verschiedene Zeitreihen übereinander:

ggplot(df) + 
  geom_point(aes(x=datum, y=garten),size=2, color="blue", shape=16) + #Klimagarten
  geom_point(aes(x=datum, y=dach),size=2, color="red", shape=16) + #Dach
  labs(x="2023",y="Temperatur [Grad Celsius]",
               title="Mittlere Tagestemperaturen")

Auch das sieht zienlich leicht aus. Schauen Sie sich die aufgerufenen Funktionen genau an. Was es zu beachten gibt, ist das Folgende: - in dem Funktionsaufruf ggplot(df) sagen wir R, dass es einen Plot erstellen soll, und die Datenbasis für den Plot ist in dem Data Frame df (den wir erstellt haben) - Anschließend rufen wir für jede zu plottende Datenreihe eine eigene Zeile aus. Im Falle von Punkten geom_point. Die notwendigen Informationen (d.h., as ist die x- und was ist die y-Variable) setzt man über die sog. Aesthetics aes()

Wo ist jedoch die Legende? Diese können wir ähnlich wie im Beispiel von baseR manuell erstellen. Aber wir können ggplot2 auch dazu bringen, diese automatisch anzulegen. dazu müssen wir jedoch die Daten vom wide-Format in das long-Format umbauen. Schauen Sie sich das vorherige Kapitel an, um nachzuvollziehen, wie dies geht. Für unser Beispiel hier bedeutet dies:

# Umwandeln von df in das long Format
df_l <- df %>% pivot_longer(cols = c("garten", "dach"),names_to = "station")

df_l
# A tibble: 62 × 3
   datum      station value
   <date>     <chr>   <dbl>
 1 2023-10-01 garten   10.2
 2 2023-10-01 dach     10.4
 3 2023-10-02 garten   12.5
 4 2023-10-02 dach     12.5
 5 2023-10-03 garten   13.0
 6 2023-10-03 dach     13.0
 7 2023-10-04 garten   13.6
 8 2023-10-04 dach     13.7
 9 2023-10-05 garten   13.9
10 2023-10-05 dach     14.0
# ℹ 52 more rows

Jetzt können wir ggplot2 Anweisungen über die verschiedenen Datenreihen geben, genauer gesagt über die aesthetics:

ggplot(df_l) +
  geom_line(aes(x=datum, y=value, group=station, color=station)) +
  labs(x="2023",y="Temperatur [Grad Celsius]", 
       title="Mittlere Tagestemperaturen")

Cool! ggplot hat das Erstellen der Legende übernommen! Wir können manuell die Legende noch modifizieren, aber das können/sollten Sie selbst recherchieren, z.B. hier oder hier.

Zuletzt können wir die beiden Reihen auch in zwei identisch formattierte Plots unterteilen. In baseR wäre dies ziemlich kompliziert, aber in ggplot2 ist dies einfacher - insbesondere wenn die Daten im long-Format vorliegen. Alles was wir tun müssen, ist den obigen plot um eine weitere Zeile ergänzen:

ggplot(df_l) + 
  geom_point(aes(x=datum, y=value)) +
  labs(x="2023",y="Temperatur [Grad Celsius]", 
       title="Mittlere Tagestemperaturen") +

  facet_grid(station ~ .) 

Super! Das Paket hat alles für uns erledigt - es hat die Designs homogenisiert, die y-achsen gleich gemacht und eine einzige y-Achsenbeschriftung erstellt; und das alles mit nur wenigen Zeilen. Dies ist ein Grund, weshalb wir die Nutzung des Paketes so sehr empfehlen und Sie damit früh in Berührung bringen. Wie immer gilt aber: Übung macht den Meister! Es hat noch keiner R (und programmieren) gelernt vom zugucken und lesen - man muss sich die Zeit nehmen und üben, ausprobieren, etc.! Tun Sie dies - wenn möglich über den Umfang des Kurses hinaus. Es wird Ihnen in Ihrem weiteren Studienverlauf helfen.