HOWTO · Matplotlib

Imposta manualmente la dimensione degli intervalli nell'istogramma Matplotlib

Per controllare la larghezza degli intervalli in un istogramma Matplotlib unidimensionale, passa i dati e una sequenza di limiti a `plt.hist(..., bins=...)`.

In questa pagina

Per controllare la larghezza degli intervalli in un istogramma Matplotlib unidimensionale, passa i dati e una sequenza di limiti a plt.hist(..., bins=...). Ogni coppia di limiti adiacenti definisce un intervallo, quindi la sequenza può creare intervalli della stessa larghezza o di larghezze diverse. hist2d() serve per gli istogrammi bidimensionali; gli esempi qui usano plt.hist().

Usare i limiti degli intervalli come parametro della funzione hist()

Usa una sequenza di limiti per scegliere dove iniziano e finiscono gli intervalli. Per esempio, [0, 10, 20, 30, 40, 50, 60, 80, 100] crea otto intervalli: i primi sei hanno larghezza 10 e gli ultimi due larghezza 20. Il numero degli intervalli è pari al numero dei limiti meno uno. I valori al di fuori del primo e dell’ultimo limite non vengono conteggiati nell’istogramma, quindi scegli un intervallo che comprenda le osservazioni da includere.

Se vuoi che tutti gli intervalli abbiano la stessa larghezza, genera limiti equidistanti con np.arange. L’esempio seguente confronta i limiti scelti con quelli equidistanti per gli stessi valori. Poiché np.arange(start, stop, step) include start ed esclude stop, il valore finale deve superare l’osservazione più grande perché questa rientri nell’intervallo.

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()

Impostare la larghezza degli intervalli in Matplotlib passando una lista come parametro

Per creare intervalli equidistanti a partire dai dati, puoi usare max(values) + width come valore finale. Poiché np.arange esclude il valore finale, quest’ultimo non diventa un limite. Con questi valori, il valore finale è 106 e l’ultimo limite generato è 100, che comprende comunque l’osservazione massima, pari a 96. Se cambiano l’intervallo dei dati o la larghezza, calcola i limiti usando i dati aggiornati invece di mantenere una lista fissa.

Intervalli equidistanti in Matplotlib passando una lista come parametro

Calcolare il numero di intervalli a partire dalla larghezza desiderata

Se l’intervallo dei dati è noto solo al momento dell’esecuzione del programma, ricava il primo e l’ultimo limite dalle osservazioni. Questo esempio arrotonda per difetto il primo limite a un multiplo della larghezza richiesta ed estende l’ultimo fino a un multiplo uguale o superiore al valore massimo. Si presuppongono dati numerici non vuoti e una larghezza positiva. Gli intervalli esterni possono estendersi oltre l’intervallo dei dati, ma la distanza tra ogni coppia di limiti adiacenti resta quella richiesta.

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()

Ricavare il numero di intervalli dalla larghezza desiderata

In questo caso, il minimo è 3 e il massimo è 96, quindi i limiti generati vanno da 0 a 100 con incrementi di 10. Le osservazioni vengono conteggiate in questi intervalli e l’istogramma usa la larghezza richiesta. Per usare una larghezza diversa, aggiorna width: lo stesso calcolo genera la sequenza di limiti corrispondente. Se i dati sono vuoti o la larghezza non è positiva, gestisci questi casi prima di calcolare i limiti.