Nota
Fare clic qui per scaricare il codice di esempio completo
Produzione di più istogrammi affiancati #
Questo esempio traccia istogrammi orizzontali di diversi campioni lungo un asse x categorico. Inoltre, gli istogrammi sono tracciati in modo da essere simmetrici rispetto alla loro posizione x, rendendoli così molto simili ai grafici di violino.
Per creare questo grafico altamente specializzato, non possiamo usare il hist
metodo standard. Invece usiamo barh
per disegnare direttamente le barre orizzontali. Le posizioni verticali e le lunghezze delle barre vengono calcolate tramite la
np.histogram
funzione. Gli istogrammi per tutti i campioni vengono calcolati utilizzando lo stesso intervallo (valori min e max) e lo stesso numero di contenitori, in modo che i contenitori per ciascun campione si trovino nelle stesse posizioni verticali.
La selezione di conteggi e dimensioni di contenitori diversi può influire in modo significativo sulla forma di un istogramma. I documenti di Astropy hanno un'ottima sezione su come selezionare questi parametri: http://docs.astropy.org/en/stable/visualization/histogram.html
import numpy as np
import matplotlib.pyplot as plt
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()
Riferimenti
L'uso delle seguenti funzioni, metodi, classi e moduli è mostrato in questo esempio: