Daten visualisieren mit Python und bokeh

In den vergangenen Beispielen zur Datenvisualisierung wurde stets die Bibliothek matplotlib verwendet. In diesem Beispiel werfen wir hingegen einen Blick auf bokeh.

Dargestellt werden soll — als Liniendiagramm — die Anzahl der Corona-Infizierten in Kiel.

Neben einer aktuellen Version von Python müssen folgende Bibliotheken installiert sein:

$ pip3 install bokeh, pandas

Als Datenquelle dient eine von der Stadt Kiel bereitgestellte CSV-Datei. Diese Datei liegt allerdings nicht in der UTF8-Zeichenkodierung vor. Um etwaige Probleme, zum Beispiel mit Umlauten, zu vermeiden, habe ich sie deswegen — mit Sublime Text — als UTF8-Datei gespeichert.

Die neu angelegte Python-Datei „corona_kiel.py“ beginnt mit den erforderlichen Import-Anweisungen:

import pandas as pd
from bokeh.plotting import ColumnDataSource
from bokeh.plotting import figure
from bokeh.plotting import show

Wenden wir uns zunächst pandas zu. Diese Bibliothek wird verwendet, um ein Dataframe, also eine Tabelle (vergleichbar mit Excel) zu erstellen. Über dieses Dataframe können die Daten aus der CSV-Datei angesprochen werden. Damit dies funktioniert, wird eine neue Variable mit der Bezeichnung df erzeugt. Die Funktion read_csv() liest die Daten und weist sie dieser Variable zu:

df = pd.read_csv("corona_zahlen_kiel.csv", sep=";")

Falls Ihr die CSV-Datei umbenannt habt, müsst Ihr dies in Eurem Code berücksichtigen. Mit sep=";" (seperator) wird festgelegt, dass in der CSV-Datei ein Semikolon als Trennzeichen verwendet wird.

Die ersten fünf Zeilen können mit

print(df.head())

ausgegeben werden. Es ist möglich über die Spaltenbezeichnungen auf die Daten der jeweiligen Spalte zuzugreifen. So gibt beispielsweise print(df["Infizierte kumuliert"]) alle Daten dieser Spalte aus. Uns interessiert hier aber zunächst die Datums-Spalte. Jedes Datum hat das Format %d.%m.%Y. Zur weiteren Verwendung wird jedes Datum in ein entsprechendes Datetime-Objekt umgewandelt. Dabei wird dieses Format — also %d.%m.%Y — als Eingabeformat angegeben:

df["Datum"] = pd.to_datetime(df["Datum"], format="%d.%m.%Y")

Damit ein Diagramm dargestellt werden kann, ist ein Container erforderlich. Dafür wird eine Variable (hier: plot) erstellt, der die Funktion figure() zugewiesen wird. Über figure() werden außerdem etwaige Beschriftungen festgelegt (Überschrift, Achsen-Bezeichnungen). Außerdem wird hierüber auch die Breite des Diagramms bestimmt (width=800):

plot = figure(title="Anzahl der Infizierten in Kiel (März 2020 - März 2021)", width=800, x_axis_label="Datum", x_axis_type="datetime", y_axis_label="Infizierte")

Folgende Zeile definiert die Datenquelle, wobei dabei die Funktion ColumnDataSource() zur Anwendung kommt, dem das Dataframe (df) übergeben wird:

datenquelle = ColumnDataSource(df)

Für die Erstellung eines Liniendiagramms ist plot.line() verantwortlich. Der Methode line() werden die Datenquelle sowie die zu verwendenden Spalten und ihre jeweilige Zuweisung an x und y übergeben:

plot.line(source=datenquelle, x="Datum", y="Infizierte aktuell")

Die Zeile show(plot) führt schließlich dazu, dass das Liniendiagramm auch im Browser angezeigt wird.

Corona-Infizierte in Kiel

Mit save(plot) kann ein Diagramm auch gespeichert werden, wobei hierfür eine zusätzliche Import-Anweisung erforderlich ist:

from bokeh.plotting import save

Die Datei wird im selben Ordner gespeichert und hat denselben Namen wie die Python-Datei, allerdings mit der Endung html. In diesem Beispiel würde sie also „corona_kiel.html“ heißen. Dieser HTML-Code könnte dann in einer Internetseite eingebunden werden.