Datenuhr in QGIS und Plotly

Visualisierung von saisonalen oder zyklischen Zeitreihendaten als kreisrunde Heatmap in Polarkoordinaten

Mir gefällt, wie die Datenuhr in ArcGIS Pro saisonale Muster in Zeitreihen visualisiert. Die Ringe des Diagramms zeigen die größere, zyklische Zeiteinheit (z. B. das Jahr), während jeder Ring in kleinere Einheiten unterteilt ist, die als Keile dargestellt werden. Natürlich wollte ich dasselbe mit Open-Source-Tools machen können, und das war in Python mit Pandas und Plotly möglich.


Beispiel einer Datenuhr. Daten: Piracy incidents, Maritime Safety Information portal

Datenuhr in QGIS

Mit meinem QGIS-Plugin Data Clock kann das Diagramm direkt aus der Processing-Toolbox erstellt werden, und zwar mit jedem Vektorlayer, das mindestens ein Date- oder DateTime-Feld enthält. Es ist auch möglich, die Funktionen der figure factory von der QGIS-Python-Konsole aus aufzurufen. Die Features werden auf diese Ringe und Keile verteilt und die Farbe wird durch die Anzahl der Features oder durch eine Aggregationsfunktion (z.B. Summe, Mittelwert, Median) auf einer bestimmten numerischen Spalte bestimmt. Die folgenden Kombinationen von Ringen und Keilen sind implementiert: Jahr-Monat, Jahr-Woche, Jahr-Tag, Woche-Tag, Tag-Stunde. Das Ergebnis ist eine HTML-Datei mit einem interaktiven Plotly-Diagramm (einschließlich eines Tooltips).

Das Plugin befindet sich in der QGIS Plugin Registry und kann in QGIS über „Erweiterungen“ – „Erweiterungen verwalten und installieren“ installiert werden. In den Einstellungen muss der Haken bei „Experimentelle Plugins anzeigen“ gesetzt sein. Plotly und Pandas müssen installiert sein.

Datenuhr in Python

Wer diese Art von Diagramm in Python mit Plotly und Pandas erstellen möchte, kann einen Blick in mein Jupyter Notebook werfen.

Plotly in der QGIS Python Console verwenden

Es ist ziemlich einfach, Plotly für jede Art von Diagrammen aus den Daten eines Vektorlayers zu verwenden, direkt von der QGIS Python-Konsole aus. Dabei ist zu beachten, dass die High-Level-Funktionen von Plotly Express Daten in einem Pandas DataFrame erwarten, daher ist es besser, die Plotly Graph Objects direkt zu verwenden. Der folgende Code holt die Daten von zwei Feldern mithilfe einer List Comprehension, erstellt ein Scatter Plot und fig.show() öffnet das Diagramm in einem Browser. Auf diese Weise kann man auf Plotly-Methoden wie update_layout(), update_traces() oder to_html() zurückgreifen.

import numpy as np
import plotly.graph_objects as go

layer = iface.activeLayer()

x_field = 'dateofocc'
y_field = 'victim_l'

x = [f[x_field] for f in layer.getFeatures()] 
y = [f[y_field] for f in layer.getFeatures()] 

fig = go.Figure(
    layout_title_text="Title"
)

fig.add_trace(go.Scatter(
    x=x,
    y=y,
    mode='markers'
))
            
fig.show()