HOWTO · Seaborn
Seaborn BoxPlot
Dieses Tutorial zeigt, wie man Boxplots mit dem Seaborn-Modul in Python erstellt
Auf dieser Seite
Mit seaborn.boxplot() lässt sich eine numerische Verteilung zusammenfassen oder lassen sich Werte über mehrere Kategorien hinweg vergleichen. Ordnen Sie die Datenspalten ausdrücklich zu, damit Seaborn weiß, welche Variable auf welche Achse gehört. Ein Boxplot zeigt den Median und den Interquartilsabstand (IQR). Bei der standardmäßigen Whisker-Regel reichen die Whisker bis zu den äußersten Beobachtungen, die höchstens 1,5 IQR von der Box entfernt liegen; weiter entfernte Beobachtungen erscheinen als einzelne Punkte.
Einen Boxplot für eine Verteilung erstellen
Legen Sie die Messwerte in einer DataFrame-Spalte ab und weisen Sie diese Spalte y zu. So ist die Rolle der Daten eindeutig, und der Plot erhält eine aussagekräftige Achsenbeschriftung. Das folgende Beispiel verwendet feste Werte und erhält daher bei jedem Ausführen dieselben Eingabedaten.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Score")
ax.set_title("Score distribution")
plt.show()
Die Linie innerhalb der Box kennzeichnet den Median. Die Box reicht vom ersten bis zum dritten Quartil; ihre Höhe zeigt somit die mittlere Hälfte der Beobachtungen. Eine höhere Box weist auf eine größere Streuung in diesem mittleren Datenbereich hin. Die Whisker zeigen den Wertebereich gemäß der gewählten Whisker-Regel und reichen nicht unbedingt bis zum Minimum oder Maximum.
Verteilungen über Kategorien hinweg vergleichen
Weisen Sie x eine Kategorie und y den numerischen Messwert zu. Dadurch erscheint für jede Kategorie eine eigene Box. In diesem Datensatz fasst jede Box den Preis (Price) für eine Mengenstufe (Quantity) zusammen. Mit hue="Product" wird jede Kategorie zusätzlich nach Produktgruppen aufgeteilt. So lassen sich Produkte bei derselben Menge vergleichen. Die Bezeichnungen Price, Quantity und Product bleiben im unveränderten Beispiel englisch.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
"Product": ["A", "A", "A", "A", "B", "B", "B", "B"] * 2,
}
)
ax = sns.boxplot(data=data, x="Quantity", y="Price", hue="Product")
ax.set_title("Price by quantity and product")
plt.show()
Verwenden Sie hue, wenn die zusätzliche Gruppierung eine konkrete Vergleichsfrage beantwortet. Bei vielen Gruppen können die Boxen dicht gedrängt sein. Vereinfachen Sie dann die Kategorien oder erstellen Sie separate Plots, damit die Verteilungen lesbar bleiben.
Einzelne Beobachtungen mit einem Stripplot anzeigen
Ein Boxplot verdichtet die Daten zu zusammenfassenden Kennzahlen. Wenn zusätzlich jede einzelne Beobachtung sichtbar sein soll, legen Sie seaborn.stripplot() darüber. Verwenden Sie für beide Ebenen dieselbe Achse und dieselben Zuordnungen. Ein leichtes horizontales Jittern verhindert, dass Punkte mit ähnlichen Werten vollständig übereinanderliegen.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Score", color="lightgray")
sns.stripplot(data=data, y="Score", color="darkred", jitter=0.15, ax=ax)
ax.set_title("Scores with individual observations")
plt.show()
Die Box bleibt die Zusammenfassung; jede Markierung steht für eine Datenzeile. Bei größeren Datensätzen können sich Punkte überlagern. Passen Sie dann die Markierungsgröße oder Transparenz an, damit dichte Bereiche gut erkennbar bleiben.
Den Boxplot anpassen
Verwenden Sie die Achsenbegrenzungen von Matplotlib, um einen relevanten Wertebereich hervorzuheben, linewidth, um die Randlinien von Box und Whiskern anzupassen, und palette, um Kategorien Farben zuzuweisen. Der Parameter orient legt die Ausrichtung fest. Mit orient="h" wird beispielsweise ein horizontaler Plot angefordert, sofern die Zuordnungen dazu passen. Achsenbegrenzungen ändern nur den sichtbaren Ausschnitt. Wählen Sie sie daher sorgfältig und halten Sie die Skalierung klar, damit relevante Beobachtungen nicht verborgen bleiben.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
"Product": ["A", "A", "A", "A", "B", "B", "B", "B"] * 2,
}
)
ax = sns.boxplot(
data=data,
x="Quantity",
y="Price",
hue="Product",
linewidth=2.5,
palette="Set2",
)
ax.set_ylim(8, 20)
ax.set_title("Customized price comparison")
plt.show()
Die Farben der Palette entsprechen den hue-Gruppen. Für horizontale Boxen tauschen Sie die Zuordnungen von Kategorie und Messwert und setzen orient="h". Wenden Sie die Achsenbegrenzungen anschließend mit set_xlim() statt mit set_ylim() an.
Einen Boxplot mit catplot() erstellen
Für die Schnittstelle auf Abbildungsebene verwenden Sie catplot() mit kind="box". Die Funktion akzeptiert dieselben ausdrücklichen Datenzuordnungen und kann mit col oder row separate Teilgrafiken erstellen, wenn eine weitere Variable den Vergleich aufteilen soll. Für einen einzelnen Plot ist seaborn.boxplot() die Option auf Achsenebene; catplot() eignet sich, wenn die Abbildung Facetten enthalten soll.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
}
)
grid = sns.catplot(data=data, x="Quantity", y="Price", kind="box")
grid.set_axis_labels("Quantity", "Price")
grid.fig.suptitle("Price by quantity")
plt.show()