So lassen sich Messwerte mit einer Heatmap visualisieren

Eine große Zahl von Messwerten lässt sich gut in einer Heatmap darstellen. Je nach Wert werden die einzelnen Zellen in einem definierten Farbgradienten entsprechend eingefärbt. Heatmaps lassen sich gut mit dem R-Package highcharter erstellen, einem Wrapper um die Javascript-Bibliothek Highcharts.
Als Vorlage für die nachfolgend erzeugt Grafik mit knapp 9.000 Messwerten diente die Demografik auf der Seite https://www.highcharts.com/demo/heatmap-canvas, die mit Javascript erzeugt wurde. Es handelt sich also um eine Art Rekonstruktion in R. Als Messwerte dienen die Temperaturen jeder einzelnen Stunde des Jahres 2016 in München. Sie stammen vom Deutschen Wetterdienst und lassen sich auf der Seite ftp://ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/ für nahezu jede Stadt in Deutschland herunterladen. Die verwendeten stündlichen Messwerte für München befinden sich hier.

library("highcharter")
library("dplyr")
library("tidyr")
library("lubridate")
library("viridis")
df <- read.csv("https://www.petitessen.net/wp-content/uploads/2017/05/stundenwerte.txt", sep = ";", header = T, row.names = NULL)
df[df == -999] = NA
df$Jahr = year(ymd_h(df$MESS_DATUM))
df$Monat = month(ymd_h(df$MESS_DATUM))
df <- df %>%
  filter(Jahr == 2016) %>%
  select(MESS_DATUM, LUFTTEMPERATUR)
df$MESS_DATUM <- ymd_h(df$MESS_DATUM)
df$MESS_DATUM_STUNDE <- hour(df$MESS_DATUM)
df$MESS_DATUM <- as.Date(as.character(df$MESS_DATUM))
df <- spread(df, MESS_DATUM_STUNDE, LUFTTEMPERATUR)
heatmap_matrix <- as.matrix(as.data.frame(lapply(df, as.numeric)))
heatmap_matrix <- heatmap_matrix[,2:25]
heatmap_matrix <- t(heatmap_matrix)
d <- c(0:365)
x <- as.Date(d, origin = "2016-01-01")
y = paste(day(x), month(x), "", sep = ".") 
colnames(heatmap_matrix) <- c(1:366)
rownames(heatmap_matrix) <- c(0:23)
options(
  highcharter.theme = hc_theme_darkunica(
    chart  = list(
      style = list(fontFamily = "Roboto Condensed"),
      backgroundColor = "#323331"),
      plotOptions = list(series = list(showInLegend = FALSE))))
hc <- hchart(heatmap_matrix, type = "heatmap") %>%
  hc_title(text = "Temperaturen in München 2016") %>%
  hc_colorAxis(stops = color_stops(10, viridis(10, option = "B")), 
               min = -7.9, max = 33.2) %>%
  hc_exporting(enabled = TRUE) %>%
  hc_xAxis(categories = y) %>% 
  hc_yAxis(title = list(text = ""),
           startOnTick = FALSE,
           endOnTick = FALSE,
           tickPositions = c(0, 6, 12, 18, 23),
           tickWidth = 1,
           min = 0, max = 23,
           labels = list(format = "{value}:00 h"),
           gridLineColor = "#B71C1C",
           reversed = TRUE) %>%
  hc_tooltip(formatter = JS("function () 
            {return this.series.xAxis.categories[this.point.x] + 
            + this.point.y + ':00 Uhr' + this.point.value + ' °C';}")) %>%
  hc_credits(enabled = TRUE, 
             text = "Source: Petitessen.net",
             href = "https://www.petitessen.net",
             style = list(fontSize = "12px"))
hc

Das Skript: Das Skript bindet zunächst fünf Packages ein; neben highcharter sind dies dplyr und tidyr für den Umgang mit dem Data Frame, lubridate für den Umgang mit Datumsangaben und viridis für den Farbgradienten. Dann wird die Textdatei mit den stündlichen Temperaturwerten eingelesen und im Data Frame df gespeichert. Es folgt eine Aufteilung der Datumsangeben in Monat und Jahr, um die Messwerte für das Jahr 2016 selektieren zu können.
Die Zeile heatmap_matrix <- as.matrix(as.data.frame(lapply(df, as.numeric))) wandelt alles in nummerische Werte um, und schließlich wird die Variable heatmap_matrix in eine Matrix umgewandelt. Nach der Festlegung der Spalten und Reihennamen folgen einige Optionen für die Heatmap, etwa die Auswahl des Themes "Dark Unica". Mehr zu highcharter hier.

Die Heatmap

Nun wird mit hc <- hchart(heatmap_matrix, type = "heatmap") %>% die Grafik erzeugt. der Pipe-Operator %>% aus dem R-Package dplyr fügt weitere Angaben hinzu. Nach der Überschrift legt hc_colorAxis(stops = color_stops(10, viridis(10, option = "B")), min = -7.9, max = 33.2) den Fargbradienten fest. Die Option B steht für "inferno". Es folgt die Definition der X-Achse. Sie enthält nummerische Datumsangaben, die zuvor mit

d <- c(0:365)
x <- as.Date(d, origin = "2016-01-01")
y = paste(day(x), month(x), "", sep = ".")

erzeugt wurden. Die Y-Achse soll die Stunden angeben in Abständen von 6 bzw. 5 Stunden. Es folgt die recht komplizierte Definition des Tooltips. Er bewirkt, dass unter dem Mauszeiger ein Kästchen mit Datum, Stunde und dazugehörigem Temperaturwert erscheint. Die Credits sind natürlich optional. Ein abschließendes hc erzeugt die farbenfrohe, interaktive Heatmap mit fast 9.000 Messwerten. Diese lässt sich in RStudio nun als Grafik oder interaktive HTML-Seite speichern.

Teile diesen Beitrag!