HOWTO · Matplotlib
Wie Sie die Größe der Bins in Matplotlib manuell einstellen
Lege die Breite der Intervalle in einem eindimensionalen Matplotlib-Histogramm fest, indem du eine Folge von Intervallgrenzen an `plt.hist()` übergibst. So erstellst du gleich breite oder unterschiedlich breite Bins.
Auf dieser Seite
Um die Breite der Intervalle in einem eindimensionalen Matplotlib-Histogramm festzulegen, übergibst du die Daten und eine Folge von Intervallgrenzen an plt.hist(..., bins=...). Je zwei benachbarte Grenzwerte definieren ein Intervall. So lassen sich gleich breite oder unterschiedlich breite Bins erstellen. hist2d() dient zweidimensionalen Histogrammen; die Beispiele hier verwenden plt.hist().
Intervallgrenzen als Parameter der Funktion hist()
Verwende eine Folge von Intervallgrenzen, wenn du festlegen möchtest, wo die Intervalle beginnen und enden. Die Werte [0, 10, 20, 30, 40, 50, 60, 80, 100] ergeben beispielsweise acht Bins: Die ersten sechs sind jeweils 10 Einheiten breit, die letzten beiden jeweils 20. Die Anzahl der Bins ist um eins kleiner als die Anzahl der Grenzwerte. Werte außerhalb des ersten und letzten Grenzwerts werden im Histogramm nicht gezählt. Wähle daher einen Bereich, der alle Beobachtungen umfasst, die du berücksichtigen möchtest.
Sollen alle Bins gleich breit sein, kannst du mit np.arange gleichmäßig verteilte Grenzwerte erzeugen. Das folgende Beispiel vergleicht frei gewählte Grenzwerte mit gleichmäßig verteilten Grenzwerten für dieselben Werte. Da np.arange(start, stop, step) den Startwert einschließt und den Endwert ausschließt, muss der Endwert über der größten Beobachtung liegen, damit diese abgedeckt ist.
import matplotlib.pyplot as plt
import numpy as np
values = np.array([3, 8, 12, 18, 24, 31, 37, 43, 52, 61, 74, 88, 96])
width = 10
explicit_edges = [0, 10, 20, 30, 40, 50, 60, 80, 100]
equal_edges = np.arange(0, 101, width)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].hist(values, bins=explicit_edges)
axes[0].set_title("Chosen boundaries")
axes[1].hist(values, bins=equal_edges)
axes[1].set_title("Equal-width bins")
for axis in axes:
axis.set_xlabel("Value")
axis.set_ylabel("Count")
fig.tight_layout()
plt.show()
Für gleich breite Bins, deren Grenzen aus den Daten abgeleitet werden, eignet sich max(values) + width als Endwert. Da np.arange den Endwert ausschließt, wird dieser selbst nicht als Grenze verwendet. Bei diesen Werten ist der Endwert 106 und die letzte erzeugte Grenze 100; damit ist auch die größte Beobachtung 96 abgedeckt. Ändern sich Wertebereich oder Breite, berechne die Grenzen aus den aktuellen Daten, statt eine feste Liste beizubehalten.
Anzahl der Bins aus der gewünschten Breite berechnen
Wenn der Datenbereich erst während der Programmausführung bekannt ist, kannst du die erste und letzte Grenze aus den Beobachtungen ableiten. Dieses Beispiel rundet die erste Grenze auf ein Vielfaches der gewünschten Breite ab und erweitert die letzte Grenze auf ein Vielfaches, das mindestens dem Maximalwert entspricht. Es setzt einen nicht leeren numerischen Datensatz und eine positive Breite voraus. Die äußeren Bins können über den Datenbereich hinausreichen; der Abstand zwischen benachbarten Grenzwerten entspricht weiterhin der gewünschten Breite.
import matplotlib.pyplot as plt
import numpy as np
values = np.array([3, 8, 12, 18, 24, 31, 37, 43, 52, 61, 74, 88, 96])
width = 10.0
first_edge = np.floor(values.min() / width) * width
last_edge = np.ceil(values.max() / width) * width
edges = np.arange(first_edge, last_edge + width, width)
plt.hist(values, bins=edges)
plt.xlabel("Value")
plt.ylabel("Count")
plt.title(f"Histogram with bin width {width:g}")
plt.show()
Hier beträgt der Minimalwert 3 und der Maximalwert 96. Daher reichen die erzeugten Grenzen in Schritten von 10 von 0 bis 100. Die Beobachtungen werden diesen Intervallen zugeordnet, und das gezeichnete Histogramm verwendet die gewünschte Breite. Für eine andere Breite musst du width anpassen; dieselbe Berechnung erzeugt dann die passenden Intervallgrenzen. Sind die Daten leer oder ist die Breite nicht positiv, musst du diese Eingabe behandeln, bevor du die Grenzen berechnest.