Seaborn Boxplot: So erstellen und passen Sie Box-Plots in Python an
Updated on
Das Verständnis der Verteilung Ihrer Daten ist eine der grundlegendsten Aufgaben in der Datenanalyse. Sie müssen Ausreißer erkennen, Gruppen vergleichen und Schiefe identifizieren, bevor Sie ein Modell ausführen oder Schlussfolgerungen ziehen. Doch das bloße Betrachten der Rohdaten in einem DataFrame gibt Ihnen selten das vollständige Bild. Ein seaborn Boxplot löst dieses Problem, indem er eine gesamte Verteilung in einer kompakten, lesbaren Grafik zusammenfasst, die Median, Streuung und Ausreißer auf einen Blick zeigt.
In diesem Leitfaden lernen Sie, wie Sie Box-Plots mit der seaborn-Bibliothek von Python erstellen, anpassen und interpretieren. Jedes Codebeispiel verwendet reale Datensätze, die in seaborn integriert sind, sodass Sie sie sofort in einem Jupyter-Notebook ausführen können.
Was ist ein Box-Plot?
Ein Box-Plot (auch Box-Whisker-Plot genannt) ist eine standardisierte Methode zur Darstellung einer Verteilung basierend auf fünf zusammenfassenden Statistiken:
| Komponente | Was sie darstellt |
|---|---|
| Medianline | Der mittlere Wert des Datensatzes (50. Perzentil) |
| Box (IQR) | Der Interquartilbereich, der sich von Q1 (25. Perzentil) bis Q3 (75. Perzentil) erstreckt |
| Unterer Whisker | Der kleinste Datenpunkt innerhalb von Q1 - 1,5 * IQR |
| Oberer Whisker | Der größte Datenpunkt innerhalb von Q3 + 1,5 * IQR |
| Ausreißerpunkte | Einzelne Datenpunkte, die außerhalb des Whisker-Bereichs liegen |
Die Box erfasst die mittleren 50% Ihrer Daten. Eine hohe Box bedeutet hohe Variabilität; eine kurze Box bedeutet, dass Ihre Werte eng beieinander liegen. Wenn die Medianlinie außermittig in der Box sitzt, ist die Verteilung schief. Punkte jenseits der Whisker markieren potenzielle Ausreißer, die eine Untersuchung verdienen.
Box-Plots sind besonders effektiv, wenn Sie Verteilungen über mehrere Kategorien nebeneinander vergleichen müssen, was sie zu einem Grundpfeiler der explorativen Datenanalyse macht.
Grundlegende Seaborn Boxplot-Syntax
Um einen Boxplot in seaborn zu erstellen, benötigen Sie nur eine Funktion: sns.boxplot(). Mindestens übergeben Sie die Daten und geben an, welche Variable geplottet werden soll.
import seaborn as sns
import matplotlib.pyplot as plt
# Laden eines integrierten Datensatzes
tips = sns.load_dataset("tips")
# Grundlegender vertikaler Boxplot
sns.boxplot(data=tips, y="total_bill")
plt.title("Verteilung der Gesamtrechnung")
plt.show()Dies erzeugt eine einzelne Box, die die Verteilung der total_bill-Werte zeigt. Die Funktion berechnet automatisch die Quartile, Whisker und Ausreißer für Sie.
Um die Daten nach einer kategorialen Variable aufzuteilen, fügen Sie den Parameter x hinzu:
sns.boxplot(data=tips, x="day", y="total_bill")
plt.title("Gesamtrechnung nach Wochentag")
plt.show()Jetzt sehen Sie vier Boxen nebeneinander, eine für jeden Tag, was es einfach macht, Ausgabenmuster über die Woche zu vergleichen.
Erstellen von Boxplots aus verschiedenen Datenformaten
Seaborn verarbeitet mehrere Datenformate elegant. Hier sind die häufigsten Szenarien.
Long-Form DataFrame (Tidy Data)
Die meisten seaborn-Funktionen funktionieren am besten mit Long-Form (Tidy) Daten, bei denen jede Zeile eine einzelne Beobachtung ist und Spalten Variablen darstellen. Der tips-Datensatz ist bereits in diesem Format:
# Long-Form: Jede Zeile ist ein Restaurantbesuch
sns.boxplot(data=tips, x="day", y="total_bill")
plt.show()Wide-Form DataFrame
Wenn Ihre Daten eine Spalte pro Gruppe haben (Wide-Format), kann seaborn dennoch direkt Boxplots erstellen:
import pandas as pd
import numpy as np
# Wide-Form-Daten erstellen
np.random.seed(42)
wide_df = pd.DataFrame({
"Group A": np.random.normal(50, 10, 100),
"Group B": np.random.normal(60, 15, 100),
"Group C": np.random.normal(45, 8, 100),
})
sns.boxplot(data=wide_df)
plt.title("Vergleich von drei Gruppen (Wide-Form-Daten)")
plt.ylabel("Wert")
plt.show()Seaborn behandelt automatisch jede Spalte als separate Kategorie und plottet sie nebeneinander.
Auswahl spezifischer DataFrame-Spalten
Wenn Sie nur bestimmte numerische Spalten aus einem größeren DataFrame visualisieren möchten, filtern Sie diese zuerst:
iris = sns.load_dataset("iris")
# Nur Messspalten auswählen
measurement_cols = iris[["sepal_length", "sepal_width", "petal_length", "petal_width"]]
sns.boxplot(data=measurement_cols)
plt.title("Iris-Merkmalverteilungen")
plt.xticks(rotation=15)
plt.show()Anpassen Ihres Seaborn Boxplots
Seaborn bietet umfangreiche Optionen zum Anpassen des Aussehens und Verhaltens Ihrer Box-Plots.
Farben und Paletten
Ändern Sie das Farbschema mit dem Parameter palette oder setzen Sie eine einzelne Farbe für alle Boxen:
# Verwendung einer benannten Palette
sns.boxplot(data=tips, x="day", y="total_bill", palette="Set2")
plt.title("Benutzerdefinierte Palette")
plt.show()# Einzelne Farbe für alle Boxen
sns.boxplot(data=tips, x="day", y="total_bill", color="skyblue")
plt.title("Einheitliche Farbe")
plt.show()Beliebte Palettenoptionen sind "Set2", "pastel", "muted", "deep", "husl" und "coolwarm".
Horizontale vs. vertikale Ausrichtung
Tauschen Sie die Achsen aus, um einen horizontalen Boxplot zu erstellen. Dies ist nützlich, wenn Kategoriebeschriftungen lang sind:
sns.boxplot(data=tips, x="total_bill", y="day", orient="h")
plt.title("Horizontaler Boxplot")
plt.show()Gruppierte Boxplots mit dem Parameter hue
Der Parameter hue teilt jede Kategorie in Untergruppen auf und fügt Ihrem Vergleich eine zweite Dimension hinzu:
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex")
plt.title("Gesamtrechnung nach Tag und Geschlecht")
plt.legend(title="Geschlecht")
plt.show()Jeder Tag zeigt jetzt zwei Boxen (eine pro Geschlecht), was es einfach macht, die Ausgabenmuster von Männern und Frauen an jedem Wochentag zu vergleichen.
Steuerung der Abbildungsgröße
Seaborn-Plots erben die Abbildungsgröße von matplotlib. Setzen Sie diese vor dem Aufruf von sns.boxplot():
plt.figure(figsize=(12, 6))
sns.boxplot(data=tips, x="day", y="total_bill", hue="smoker", palette="muted")
plt.title("Gesamtrechnung nach Tag und Raucherstatus")
plt.show()Hinzufügen von Swarm- oder Strip-Plot-Overlays
Ein Boxplot fasst die Verteilung zusammen, verbirgt aber einzelne Datenpunkte. Überlagern Sie einen Swarm-Plot oder Strip-Plot, um jede Beobachtung anzuzeigen:
plt.figure(figsize=(10, 6))
sns.boxplot(data=tips, x="day", y="total_bill", palette="pastel")
sns.stripplot(data=tips, x="day", y="total_bill", color="0.3", size=3, jitter=True, alpha=0.5)
plt.title("Boxplot mit Strip-Plot-Overlay")
plt.show()plt.figure(figsize=(10, 6))
sns.boxplot(data=tips, x="day", y="total_bill", palette="pastel")
sns.swarmplot(data=tips, x="day", y="total_bill", color="0.25", size=3, alpha=0.6)
plt.title("Boxplot mit Swarm-Plot-Overlay")
plt.show()Der Swarm-Plot ordnet Punkte so an, dass sie sich nicht überlappen, was ein besseres Gefühl für die Datendichte vermittelt. Verwenden Sie Strip-Plots, wenn Sie viele Datenpunkte haben, und Swarm-Plots, wenn Sie weniger haben (Swarm-Plots können bei Tausenden von Punkten langsam werden).
Seaborn Boxplot-Parameterreferenz
Hier ist eine Kurzreferenz für die am häufigsten verwendeten Parameter in sns.boxplot():
| Parameter | Typ | Beschreibung |
|---|---|---|
data | DataFrame, Array oder Liste | Eingabedatenstruktur |
x, y | str oder Array | Variablen für die Achsen |
hue | str | Gruppierungsvariable für farbcodierte Untergruppen |
order | Liste von str | Reihenfolge zum Plotten der kategorialen Ebenen |
hue_order | Liste von str | Reihenfolge für die Hue-Ebenen |
orient | "v" oder "h" | Ausrichtung des Plots |
color | str | Einzelne Farbe für alle Elemente |
palette | str, Liste oder dict | Farben für verschiedene Ebenen |
saturation | float | Anteil der ursprünglichen Sättigung (0 bis 1) |
fill | bool | Ob die Box mit Farbe gefüllt werden soll (seaborn >= 0.13) |
width | float | Breite der Boxen (Standard 0,8) |
dodge | bool | Ob Hue-Gruppen entlang der kategorialen Achse verschoben werden sollen |
fliersize | float | Größe der Ausreißermarker |
linewidth | float | Breite der Linien, die die Box umrahmen |
whis | float oder Tupel | Whisker-Länge als Vielfaches des IQR (Standard 1,5) |
ax | matplotlib Axes | Axes-Objekt, auf dem der Plot gezeichnet werden soll |
Vergleich von Verteilungen
Mehrere Spalten nebeneinander
Beim Vergleich von Verteilungen mehrerer numerischer Merkmale schmelzen Sie Ihren DataFrame in die Long-Form:
iris = sns.load_dataset("iris")
# Von Wide zu Long-Format schmelzen
iris_long = iris.melt(id_vars="species", var_name="measurement", value_name="cm")
plt.figure(figsize=(12, 6))
sns.boxplot(data=iris_long, x="measurement", y="cm", palette="Set3")
plt.title("Vergleich der Iris-Messungen")
plt.show()Gruppierte Vergleiche mit hue
Kombinieren Sie sowohl eine Kategorie als auch eine Gruppierungsvariable, um Verteilungen über zwei Dimensionen zu vergleichen:
plt.figure(figsize=(14, 6))
sns.boxplot(data=iris_long, x="measurement", y="cm", hue="species", palette="husl")
plt.title("Iris-Messungen nach Art")
plt.legend(title="Art", bbox_to_anchor=(1.05, 1), loc="upper left")
plt.tight_layout()
plt.show()Dies erzeugt einen gruppierten Boxplot, bei dem jeder Messtyp drei Boxen zeigt (eine pro Art), was den artenübergreifenden Vergleich sofort ermöglicht.
Seaborn Boxplot vs. Matplotlib Boxplot
Sowohl seaborn als auch matplotlib können Box-Plots erzeugen, unterscheiden sich jedoch erheblich in der Benutzerfreundlichkeit und visuellen Qualität.
| Merkmal | Seaborn sns.boxplot() | Matplotlib ax.boxplot() |
|---|---|---|
| Standard-Ästhetik | Poliert, publikationsreif | Grundlegend, minimales Styling |
| DataFrame-Integration | Native Unterstützung für pandas DataFrames | Erfordert manuelles Extrahieren von Arrays |
| Hue-Gruppierung | Eingebauter hue-Parameter | Manuelle Positionierung und Färbung |
| Paletten | Einzeilige Palettenzuweisung | Manuelle Farblistenverwaltung |
| Statistische Anmerkungen | Einfaches Overlay mit Swarm/Strip-Plots | Erfordert manuelle Scatter-Overlays |
| Anpassungstiefe | Moderat (delegiert an matplotlib) | Vollständige Low-Level-Kontrolle |
| Lernkurve | Niedrig | Mittel bis hoch |
| Code-Ausführlichkeit | 1-2 Zeilen für einen gruppierten Plot | 10-20 Zeilen für Äquivalent |
Fazit: Verwenden Sie seaborn für schnelle explorative Analysen und saubere Visualisierungen. Greifen Sie auf matplotlib zurück, wenn Sie pixelgenaue Kontrolle über jedes Element benötigen.
# Matplotlib Boxplot (ausführlicher)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 5))
data_by_day = [tips[tips["day"] == d]["total_bill"].values for d in ["Thur", "Fri", "Sat", "Sun"]]
bp = ax.boxplot(data_by_day, labels=["Thur", "Fri", "Sat", "Sun"], patch_artist=True)
for patch, color in zip(bp["boxes"], ["#8dd3c7", "#ffffb3", "#bebada", "#fb8072"]):
patch.set_facecolor(color)
ax.set_title("Matplotlib Boxplot (Manuelles Styling)")
ax.set_ylabel("Gesamtrechnung")
plt.show()# Seaborn-Äquivalent (prägnant)
sns.boxplot(data=tips, x="day", y="total_bill", palette="Set3",
order=["Thur", "Fri", "Sat", "Sun"])
plt.title("Seaborn Boxplot (Eine Zeile)")
plt.show()Box-Plot vs. Violin-Plot: Wann was verwenden
Seaborn bietet auch sns.violinplot(), der die vollständige Dichteform der Verteilung zeigt, nicht nur die zusammenfassenden Statistiken. Hier ist, wann Sie jeweils wählen sollten:
| Kriterium | Box-Plot | Violin-Plot |
|---|---|---|
| Am besten für | Schnelle zusammenfassende Statistiken und Ausreißererkennung | Verständnis der vollständigen Form der Verteilung |
| Zeigt Ausreißer | Ja, als einzelne Punkte | Nein (in die Dichtekurve absorbiert) |
| Zeigt Bimodalität | Nein | Ja (sichtbar als zwei Beulen) |
| Lesbarkeit | Hoch, auch für nicht-technisches Publikum | Erfordert mehr Erklärung |
| Raumeffizienz | Kompakt | Breiter, nimmt mehr horizontalen Raum ein |
| Leistung | Schnelles Rendering | Langsamer bei großen Datensätzen (KDE-Berechnung) |
Faustregel: Beginnen Sie mit einem Boxplot für schnelle Überprüfungen. Wechseln Sie zu einem Violin-Plot, wenn Sie vermuten, dass die Verteilung mehrere Spitzen oder eine ungewöhnliche Form hat.
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
sns.boxplot(data=tips, x="day", y="total_bill", palette="Set2", ax=axes[0])
axes[0].set_title("Box-Plot")
sns.violinplot(data=tips, x="day", y="total_bill", palette="Set2", ax=axes[1])
axes[1].set_title("Violin-Plot")
plt.tight_layout()
plt.show()Interaktive Alternative: Verteilungen mit PyGWalker erkunden
Statische Box-Plots funktionieren gut für Berichte und Notebooks, aber wenn Sie sich in der frühen Erkundungsphase befinden, möchten Sie oft verschiedene Variablen in ein Diagramm ziehen und wieder herausnehmen, ohne jedes Mal Code neu zu schreiben.
PyGWalker (opens in a new tab) ist eine Open-Source-Python-Bibliothek, die jeden pandas DataFrame direkt in Jupyter Notebook in eine interaktive, Tableau-ähnliche visuelle Erkundungsschnittstelle verwandelt. Sie können Box-Plots, Violin-Plots, Histogramme, Streudiagramme und mehr erstellen, indem Sie einfach Felder auf die Achsen ziehen. Keine Codeänderungen erforderlich.
pip install pygwalkerimport pandas as pd
import pygwalker as pyg
tips = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv")
walker = pyg.walk(tips)Sobald die Benutzeroberfläche geladen ist, ziehen Sie day auf die X-Achse und total_bill auf die Y-Achse und wählen Sie dann den Box-Plot-Markierungstyp aus. Sie können sofort zu einem Violin-Plot wechseln, Farbdimensionen hinzufügen oder nach einer beliebigen Spalte filtern, alles ohne eine einzige zusätzliche Codezeile zu schreiben.
Dies ist besonders wertvoll für Teams, in denen nicht jeder Python schreibt. Teilen Sie das Notebook und lassen Sie Stakeholder die Daten selbst erkunden.
| PyGWalker in Kaggle ausführen (opens in a new tab) | PyGWalker in Google Colab ausführen (opens in a new tab) | PyGWalker auf GitHub (opens in a new tab) |
|---|
FAQ
Wie entferne ich Ausreißer aus einem seaborn Boxplot?
Setzen Sie den Parameter whis auf einen größeren Wert (z. B. whis=3.0), um die Whisker zu verlängern und die Anzahl der als Ausreißer angezeigten Punkte zu reduzieren. Alternativ setzen Sie flierprops={"marker": ""}, um die Ausreißermarker vollständig zu verbergen, während die Whisker-Berechnung unverändert bleibt.
Kann ich einen seaborn Boxplot ohne Verwendung eines DataFrames plotten?
Ja. Sie können rohe Arrays oder Listen direkt übergeben: sns.boxplot(x=["A"]*50 + ["B"]*50, y=np.random.randn(100)). Die Verwendung eines DataFrames mit benannten Spalten wird jedoch empfohlen, da dadurch automatisch Achsenbeschriftungen generiert werden.
Wie ändere ich den Ausreißer-Markierungsstil in sns.boxplot?
Übergeben Sie ein Wörterbuch an den Parameter flierprops: sns.boxplot(data=tips, x="day", y="total_bill", flierprops={"marker": "D", "markerfacecolor": "red", "markersize": 5}). Dies ändert Ausreißermarker in rote Diamanten.
Was ist der Unterschied zwischen hue und x im seaborn Boxplot?
Der Parameter x definiert die primäre kategoriale Gruppierung auf der horizontalen Achse. Der Parameter hue fügt eine sekundäre Gruppierung innerhalb jeder Kategorie hinzu, die als nebeneinander liegende farbige Boxen angezeigt wird. Verwenden Sie x allein für einfache Vergleiche und fügen Sie hue hinzu, wenn Sie jede Kategorie nach einer zweiten Variable wie Geschlecht oder Status aufschlüsseln möchten.
Wie speichere ich einen seaborn Boxplot in einer Datei?
Rufen Sie nach dem Erstellen des Plots plt.savefig("boxplot.png", dpi=300, bbox_inches="tight") auf. Seaborn-Plots sind unter der Haube matplotlib-Abbildungen, sodass alle matplotlib-Speichermethoden funktionieren. Unterstützte Formate sind PNG, PDF, SVG und EPS.
Fazit
Der seaborn Boxplot ist eine der schnellsten Möglichkeiten, zu verstehen, wie Ihre Daten verteilt sind, Ausreißer zu erkennen und Gruppen zu vergleichen. Mit sns.boxplot() gehen Sie von einem rohen DataFrame zu einer publikationsreifen Visualisierung in einer einzigen Codezeile. Der Parameter hue fügt gruppierte Vergleiche ohne zusätzlichen Aufwand hinzu, und das Überlagern von Strip- oder Swarm-Plots füllt die Details einzelner Datenpunkte aus, die Box-Plots abstrahieren.
Für statische Analysen in Notebooks und Berichten sind seaborn Boxplots schwer zu schlagen. Wenn Sie eine interaktive Erkundungsebene auf Ihren pandas-Daten benötigen, ermöglichen Ihnen Tools wie PyGWalker (opens in a new tab), Visualisierungen ohne Codeänderungen zu erstellen und zu iterieren.
Beginnen Sie mit den obigen Grundbeispielen, experimentieren Sie mit Paletten und Overlays, und Sie werden über ein zuverlässiges visuelles Toolkit für jede Frage zur Datenverteilung verfügen, die Ihnen begegnet.