Visualisierung

Zuletzt aktualisiert am 2025-02-04 | Diese Seite bearbeiten

Geschätzte Zeit: 25 Minuten

Übersicht

Fragen

  • Wie visualisiere ich Daten?

Ziele

  • Datenvisualisierung mit Dataframes und plotnine in Python

Die Visualisierung von Daten ist ein wichtiger Bestandteil der Datenanalyse, da sie es ermöglicht, Muster und Zusammenhänge in den Daten zu erkennen und zu kommunizieren. In Python gibt es mehrere Pakete für Datenvisualisierung. Ein beliebtes, das wir auch hier vorstellen werden, ist plotnine, das auf ggplot und der Grammar of Graphics basiert. Hierbei müssen die Daten in tabellarischer Form vorliegen, d.h. jede Zeile entspricht einem Datensatz und jede Spalte einer Variable (“tidy data”).

Die Visualisierung von Daten wird in verschiedene Schichten (z.B. Punkte, Linien, Balken) und Eigenschaften (z.B. x-Achse, y-Achse, Farbe, Form) unterteilt. Die Verküpfung von Tabellenspalten mit den Ebenen und Eigenschaften (d.h. Welche Information wird wie fürs Plotting verwendet) erfolgt über die Funktion aes(), was für aesthetic mapping steht. Geometrische Schichten (z.B. Balken, Linien, Punkte) werden mit geom_*() Funktionen hinzugefügt.

Im Folgenden wird ein umfangreiches Beispiel für die Visualisierung von Daten mit plotnine gezeigt, bei dem die Anzahl der Stürme pro Jahr visualisiert wird.

PYTHON

import pandas as pd
# Alle Funktionen des Pakets plotnine importieren:
from plotnine import *

# Sturmdaten aus dem Internet laden
storms = pd.read_csv("https://raw.githubusercontent.com/tidyverse/dplyr/master/data-raw/storms.csv")

# Zunächst einen Dataframe mit der Anzahl der Stürme pro Jahr erstellen
storms_per_year = (storms
    # Duplikate entfernen um nur die Spalten "year" und "name" behalten
    .drop_duplicates(["year", "name"])
    # Gruppieren nach Jahr
    .groupby("year")
    # Anzahl der Stürme ermitteln
    .agg({"name": "count"})
    # Index zurücksetzen
    .reset_index()
    # Anzahl-Spalte umbenennen in "storm_count"
    .rename(columns={"name": "storm_count"})
)

# Plot erstellen
plot = (ggplot(storms_per_year, mapping=aes(x="year", y="storm_count"))
    # Diagrammtitel und Achsenbeschriftung
    + labs(title="Anzahl der Stürme pro Jahr", x="Jahr", y="Anzahl")
    # grundlegende Diagrammformatierung
    + theme_minimal()
    # Balkendiagramm mit Anzahl der Stürme pro Jahr
    + geom_bar(fill="skyblue", stat="identity")
    # gepunktete horizontale Linie bei 20
    + geom_hline(yintercept=20, linetype="dotted", color="red")
    # Highlighting der Jahre mit mehr als 20 Stürmen
    + geom_vline(
        data=lambda x: x[x["storm_count"] > 20],
        mapping=aes(xintercept="year"),
        color="red"     # Schriftfarbe rot
    )
    # Jahreszahlen der Jahre mit mehr als 20 Stürmen in schräger Textausrichtung
    + geom_text(
        data=lambda x: x[x["storm_count"] > 20],
        mapping=aes(label="year", x="year", y="storm_count"),
        angle=70,       # Schräge Textausrichtung
        nudge_y=1,      # Text leicht nach oben versetzen
        nudge_x=-0.8,   # Text leicht nach links versetzen
        size=8,         # Schriftgröße 8
        color="red"     # Schriftfarbe rot
    )    
)

# Plot anzeigen
plot.show()

PYTHON

# optional: Diagramm als Bilddatei speichern
plot.save("storms_per_year.png", width=10, height=10, dpi=300)

Als Nachschlagewerk für alle verfügbaren und im Beispiel verwendeten Funktionen empfiehlt sich die plotnine Dokumentation, in der die Funktionen gruppiert nach deren Zweck gelistet und detailliert beschrieben sind.

Einen empfehlenswerten Cheatsheet für plotnine gibt es leider nicht, aber es gibt ein Cheatsheet für ggplot2, das einen guten Überblick über die ggplot-Funktionen enthält. Das Cheatsheet enthält einige für die Programmiersprache R spezifische Zeilen, aber die meisten Funktionen sind auch in plotnine verfügbar mit gleicher oder ähnlicher Syntax in Python:

Klicken zum Herunterladen: Cheatsheet für ggplot2

Sturmposition visualisieren

Zeichnen sie ein Punktdiagram, welches für folgenden Datensatz

  • Längengrad (x-Achse) und Breitengrad (y-Achse) der Messung zeigt und die Punkte anhand des Sturmstatus einfärbt,
  • die Achsen mit “Längengrad” und “Breitengrad” beschriftet, und
  • den Diagrammtitel “Sturmposition” hat.

PYTHON

mesaurements = storms.drop_duplicates(["name", "year"], keep="last")
plot = (ggplot(
    # TODO: Plot erstellen
  )
)
plot.show()

PYTHON

mesaurements = storms.drop_duplicates(["name", "year"], keep="last")
plot = (ggplot(mesaurements, mapping=aes(x="long", y="lat", color="status"))
    + geom_point()
    + labs(
        title="Sturmposition", 
        x="Längengrad", 
        y="Breitengrad",
        color="Status" # ansonsten wird status kleingeschrieben
    )
)   
plot.show()

Alternativ zu + labs() können die se Informationen auch separat mit den Funktionen geom_title(), geom_xlab(), geom_ylab() und geom_color() hinzugefügt werden. Sie können auch versuchen, alle Sturmmessungen zu visualisieren, anstatt nur die letzten Messungen pro Sturm zu verwenden, dann sind die Sturmpfade sichtbar.

Hauptpunkte

  • plotnine benötigt einen pandas Dataframe als Eingabe, der “tidy” ist (d.h. eine Zeile pro Beobachtung und eine Spalte pro Variable).
  • Das mapping Argument ermöglicht mittels der aes() Funktion die Verknüpfung von Variablen des Datensatzes (d.h. Spaltennamen) mit visuellen Eigenschaften (z.B. x-Achse, Farbe, Größe).
  • geom_* Funktionen fügen dem Plot Schichten hinzu (z.B. Punkte, Linien, Balken).
  • labs() ermöglicht die Anpassung von Diagrammtitel und Achsenbeschriftung.
  • theme_* Funktionen ermöglichen die Anpassung genereller Diagrammformatierungen (z.B. Hintergrundfarben, Schriftarten).
  • Es gibt viele weitere Funktionen und Argumente, um die Darstellung von Diagrammen zu verfeinern (z.B. facet_wrap(), scale_*(), coord_*()).
  • Diagramme können mit save() in beliebigem Dateiformat (PNG, PDF, SVG, ..) gespeichert werden.
  • Zusammenfassung im ggplot2 Cheat Sheet