Veröffentlichungsdatum

24. Oktober 2023

Für die heutige Übung brauchst du den Datensatz temperature_2005.csv. Dabei handelt es sich wieder um Teperaturwerte verschiedener Stationen, diesmal aus dem Jahr 2005. Das Datum ist so formatiert, dass R (isbesondere read_csv) es korrekt als datetime erkennen und als POSIXct einlesen sollte.

library("readr")
library("dplyr")
library("lubridate")
library("tidyr")
library("ggplot2")
temperature <- read_delim("datasets/infovis/temperature_2005.csv", ",")

Aufgabe 1

Mache aus der wide table eine long table die wie folgt aussieht.

Code
temperature_long <- pivot_longer(temperature, -time, names_to = "station", values_to = "temperature")

knitr::kable(head(temperature_long))
time station temperature
2005-01-01 ALT 1.3
2005-01-01 BUS 1.5
2005-01-01 GVE 1.1
2005-01-01 INT 0.2
2005-01-01 OTL 2.2
2005-01-01 LUG 1.7

Importiere anschliessend den Datensatz temperature_2005_metadata.csv und verbinde die beiden Datensätze mit einem left_join via station (bzw. stn).

Code
metadata <- read_delim("datasets/infovis/temperature_2005_metadata.csv", ",")

temperature_long <- left_join(temperature_long, metadata, by = c(station = "stn"))

Aufgabe 2

Erstelle ein Scatterplot (time vs. temperature) wobei die Punkte aufgrund ihrer Meereshöhe eingefärbt werden sollen. Tiefe Werte sollen dabei blau eingefärbt werden und hohe Werte rot (scale_color_gradient). Verkleinere die Punkte um übermässiges Überplotten der Punkten zu vermeiden (size =). Weiter sollen auf der x-Achse im Abstand von 3 Monaten der jeweilige Monat vermerkt sein (date_breaks bzw. date_labels von scale_x_datetime()).

Code
# Musterlösung
ggplot(temperature_long, aes(time, temperature, color = Meereshoehe)) +
  geom_point(size = 0.5) +
  labs(x = "", y = "Temperatur in ° Celsius") +
  scale_x_datetime(date_breaks = "3 months", date_labels = "%b") +
  scale_color_gradient(low = "blue", high = "red")

Aufgabe 3

Erstelle eine Zusatzvariabel Date mit dem Datum der jeweiligen Messung ( mit as.Date). Nutze diese Spalte um die Tagesmitteltemperatur pro Station zu berechnen (mit summarise()).

Um die Metadaten (Name, Meereshoehe, x, y) nicht zu verlieren kannst du den Join aus der ersten Übung wieder ausführen. Alternativ (schneller aber auch schwerer zu verstehen) kannst du diese Variabeln innerhalb deines group_by verwenden.

Code
temperature_long <- temperature_long |>
  mutate(time = as.Date(time)) |>
  group_by(time, station, Name, Meereshoehe, x, y) |>
  summarise(temperature = mean(temperature))

Aufgabe 4

Wiederhole nun den Plot aus der ersten Aufgabe mit den aggregierten Daten aus der vorherigen Aufgabe. Um die labels korrekt zu setzen musst du scale_x_datetime mit scale_x_date ersetzen.

Code
p <- ggplot(temperature_long, aes(time, temperature, color = Meereshoehe)) +
  geom_point(size = 0.5) +
  labs(x = "", y = "Temperatur in ° Celsius") +
  scale_x_date(date_breaks = "3 months", date_labels = "%b") +
  scale_color_gradient(low = "blue", high = "red")
p

Aufgabe 5

Füge am obigen Plot eine schwarze, gestrichelte Trendlinie hinzu.

Code
# Musterlösung
p <- p +
  stat_smooth(colour = "black", lty = 2)
p

Aufgabe 6

Positioniere die Legende oberhalb des Plots (nutze dazu theme() mit legend.position).

Code
# Musterlösung
p <- p +
  theme(legend.position = "top")
p

Aufgabe 7 (optional, fortgeschritten)

Füge den Temperaturwerten auf der y-Ache ein °C hinzu (siehe unten und studiere diesen Tipp zur Hilfe).

Code
# Musterlösung
p <- p +
  scale_y_continuous(labels = function(x) paste0(x, "°C")) +
  labs(x = "Kalenderwoche", y = "Temperatur")
p

Aufgabe 8

Jetzt verlassen wir den Scatterplot und machen einen Boxplot mit den Temperaturdaten. Färbe die Boxplots wieder in Abhängigkeit der Meereshöhe ein.

  • Beachte den Unterschied zwischen colour = und fill =
  • Beachte den Unterschied zwischen facet_wrap() und facet_grid()
  • facet_grid() braucht übrigens noch einen Punkt (.) zur Tilde (~).
  • Beachte den Unterschied zwischen “.~” und “~.” bei facet_grid()
  • verschiebe nach Bedarf die Legende
Code
# Musterlösung
temperature_long <- mutate(temperature_long, monat = month(time, label = T, abbr = F))

ggplot(temperature_long, aes(monat, temperature, fill = Meereshoehe)) +
  geom_boxplot() +
  labs(x = "Station", y = "Temperatur") +
  facet_wrap(~station) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Aufgabe 9

Als letzter wichtiger Plottyp noch zwei Übungen zum Histogramm. Erstelle ein Histogramm geom_histogram() mit den Temperaturwerten. Teile dazu die Stationen in verschiedene Höhenlagen ein (Tieflage [< 400 m], Mittellage [400 - 600 m] und Hochlage [> 600 m]). Vergleiche die Verteilung der Temperaturwerte in den verschiedenen Lagen mit einem Histogramm.

Tip: Nutze cut um die Stationen in die drei Gruppen aufzuteilen

Code
# Musterlösung
temperature_long <- temperature_long |>
  mutate(lage = cut(Meereshoehe, c(0, 400, 600, 1000), labels = c("Tieflage", "Mittellage", "Hochlage")))

ggplot(temperature_long, aes(temperature)) +
  geom_histogram() +
  facet_grid(~lage) +
  labs(x = "Lage", y = "Temperatur") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))