library("readr")
library("dplyr")
library("lubridate")
library("tidyr")
library("ggplot2")
Infovis 2: Übung A
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.
<- read_delim("datasets/infovis/temperature_2005.csv", ",") temperature
Aufgabe 1
Mache aus der wide table eine long table die wie folgt aussieht.
Code
<- pivot_longer(temperature, -time, names_to = "station", values_to = "temperature")
temperature_long
::kable(head(temperature_long)) knitr
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
<- read_delim("datasets/infovis/temperature_2005_metadata.csv", ",")
metadata
<- left_join(temperature_long, metadata, by = c(station = "stn")) temperature_long
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
<- ggplot(temperature_long, aes(time, temperature, color = Meereshoehe)) +
p 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 =
undfill =
- Beachte den Unterschied zwischen
facet_wrap()
undfacet_grid()
facet_grid()
braucht übrigens noch einen Punkt (.
) zur Tilde (~
).- Beachte den Unterschied zwischen “
.~
” und “~.
” beifacet_grid()
- verschiebe nach Bedarf die Legende
Code
# Musterlösung
<- mutate(temperature_long, monat = month(time, label = T, abbr = F))
temperature_long
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))