Mehrere Histogramme nebeneinander#

Dieses Beispiel plottet horizontale Histogramme verschiedener Stichproben entlang einer kategorialen x-Achse. Zusätzlich sind die Histogramme so geplottet, dass sie symmetrisch um ihre x-Position liegen, was sie sehr ähnlich zu Violinplots macht.

Um diesen hochspezialisierten Plot zu erstellen, können wir nicht die Standardmethode hist verwenden. Stattdessen verwenden wir barh, um die horizontalen Balken direkt zu zeichnen. Die vertikalen Positionen und Längen der Balken werden über die Funktion np.histogram berechnet. Die Histogramme für alle Stichproben werden unter Verwendung des gleichen Bereichs (Minimal- und Maximalwerte) und der gleichen Anzahl von Bins berechnet, sodass die Bins für jede Stichprobe an den gleichen vertikalen Positionen liegen.

Die Auswahl unterschiedlicher Bin-Anzahlen und -Größen kann die Form eines Histogramms erheblich beeinflussen. Die Astropy-Dokumentation enthält einen hervorragenden Abschnitt darüber, wie diese Parameter ausgewählt werden: http://docs.astropy.org/en/stable/visualization/histogram.html

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)
number_of_bins = 20

# An example of three data sets to compare
number_of_data_points = 387
labels = ["A", "B", "C"]
data_sets = [np.random.normal(0, 1, number_of_data_points),
             np.random.normal(6, 1, number_of_data_points),
             np.random.normal(-3, 1, number_of_data_points)]

# Computed quantities to aid plotting
hist_range = (np.min(data_sets), np.max(data_sets))
binned_data_sets = [
    np.histogram(d, range=hist_range, bins=number_of_bins)[0]
    for d in data_sets
]
binned_maximums = np.max(binned_data_sets, axis=1)
x_locations = np.arange(0, sum(binned_maximums), np.max(binned_maximums))

# The bin_edges are the same for all of the histograms
bin_edges = np.linspace(hist_range[0], hist_range[1], number_of_bins + 1)
heights = np.diff(bin_edges)
centers = bin_edges[:-1] + heights / 2

# Cycle through and plot each histogram
fig, ax = plt.subplots()
for x_loc, binned_data in zip(x_locations, binned_data_sets):
    lefts = x_loc - 0.5 * binned_data
    ax.barh(centers, binned_data, height=heights, left=lefts)

ax.set_xticks(x_locations, labels)

ax.set_ylabel("Data values")
ax.set_xlabel("Data sets")

plt.show()
multiple histograms side by side

Tags: domain: statistics plot-type: barh plot-type: histogram styling: position

Referenzen

Die Verwendung der folgenden Funktionen, Methoden, Klassen und Module wird in diesem Beispiel gezeigt

Galerie generiert von Sphinx-Gallery