import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
hist, bins = np.histogram(x, bins=50)
width = 0.7 * (bins[1] - bins[0])
center = (bins[:-1] + bins[1:]) / 2
plt.bar(center, hist, align='center', width=width)
plt.show()
L'interface orientée objet est également simple:
fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")
Si vous utilisez des bacs personnalisés (non constants), vous pouvez transmettre le calcul des largeurs en utilisant np.diff
, transmettre les largeurs à ax.bar
et utiliser ax.set_xticks
pour étiqueter les bords des bacs :
import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200]
hist, bins = np.histogram(x, bins=bins)
width = np.diff(bins)
center = (bins[:-1] + bins[1:]) / 2
fig, ax = plt.subplots(figsize=(8,3))
ax.bar(center, hist, align='center', width=width)
ax.set_xticks(bins)
fig.savefig("/tmp/out.png")
plt.show()
plt.bar
de »width
paramètre peut accepter un objet en forme de matrice ( au lieu d'un scalaire). Vous pouvez donc utiliser à lawidth = np.diff(bins)
place dewidth = 0.7 * (bins[1] - bins[0])
.width
réglage en lui-même ne définit que la largeur de la barre, non? Je parle des étiquettes de l'axe x (c'est-à-dire que je veux voir les bords réels du bac étant des étiquettes sur l'axe des x). Cela devrait être similaire à la façon dontplt.hist
fonctionne.ax.set_xticks
pour définir les xlabels. J'ai ajouté un exemple ci-dessus pour montrer ce que je veux dire.Si vous ne voulez pas de barres, vous pouvez le tracer comme ceci:
la source
ax.step
.Je sais que cela ne répond pas à votre question, mais je finis toujours sur cette page, lorsque je recherche la solution matplotlib aux histogrammes, car le simple a
histogram_demo
été supprimé de la page de la galerie d'exemples matplotlib.Voici une solution qui ne nécessite pas
numpy
d'être importée. J'importe uniquement numpy pour générer les donnéesx
à tracer. Il repose sur la fonctionhist
au lieu de la fonctionbar
comme dans la réponse de @unutbu.Consultez également la galerie matplotlib et les exemples matplotlib .
la source
Si vous êtes prêt à utiliser
pandas
:la source
pandas
vous devriez probablement inclure un lien vers leur site et un exemple plus détaillé qui explique ce qui se passe.Je pense que cela pourrait être utile pour quelqu'un.
La fonction d'histogramme de Numpy, à mon grand désagrément (bien que, j'apprécie qu'il y ait une bonne raison à cela), renvoie les bords de chaque bac, plutôt que la valeur de la case. Bien que cela ait du sens pour les nombres à virgule flottante, qui peuvent se trouver dans un intervalle (c'est-à-dire que la valeur centrale n'est pas très significative), ce n'est pas la sortie souhaitée lorsqu'il s'agit de valeurs discrètes ou d'entiers (0, 1, 2, etc.) . En particulier, la longueur des cases renvoyées par np.histogram n'est pas égale à la longueur des comptages / densité.
Pour contourner cela, j'ai utilisé np.digitize pour quantifier l'entrée et renvoyer un nombre discret de bacs, ainsi qu'une fraction de comptage pour chaque bac. Vous pouvez facilement modifier pour obtenir le nombre entier de comptes.
Réf:
[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html
la source