J'ai donc un petit problème. J'ai un ensemble de données dans scipy qui est déjà au format d'histogramme, donc j'ai le centre des cases et le nombre d'événements par case. Comment puis-je maintenant tracer est comme un histogramme. J'ai juste essayé
bins, n=hist()
mais ça n'a pas plu. Des recommandations?
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 emplacements personnalisés (non constants), vous pouvez passer le calcul des largeurs à l'aide de np.diff
, passez les largeurs à ax.bar
et utilise ax.set_xticks
pour étiqueter les bords de la corbeille:
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()
Si vous ne voulez pas de barres, vous pouvez le tracer comme ceci:
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins, edges = np.histogram(x, 50, normed=1)
left,right = edges[:-1],edges[1:]
X = np.array([left,right]).T.flatten()
Y = np.array([bins,bins]).T.flatten()
plt.plot(X,Y)
plt.show()
Je sais que cela ne répond pas à votre question, mais je me retrouve toujours sur cette page lorsque je recherche la solution matplotlib des histogrammes, car le simple histogram_demo
a été supprimé de la page de la galerie matplotlib.
Voici une solution, qui n'exige pas que numpy
soit importé. J'importe uniquement numpy pour générer les données x
à tracer. Il s'appuie sur la fonction hist
au lieu de la fonction bar
comme dans le réponse de @unutbu.
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
import matplotlib.pyplot as plt
plt.hist(x, bins=50)
plt.savefig('hist.png')
Consultez également les galerie matplotlib et les exemples matplotlib .
Si vous êtes prêt à utiliser pandas
:
pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')
Je pense que cela pourrait être utile pour quelqu'un.
La fonction d'histogramme de Numpy, à mon grand désagrément (même si, j'en conviens, elle a une bonne raison), renvoie les bords de chaque casier plutôt que la valeur de ce dernier. Bien que cela ait du sens pour les nombres à virgule flottante, qui peuvent se situer dans un intervalle (c'est-à-dire que la valeur centrale n'est pas très significative), ce n'est pas la sortie désirée lorsqu'il s'agit de valeurs discrètes ou d'entiers (0, 1, 2, etc.) . En particulier, la longueur des bacs renvoyés par np.histogram n’est pas égale à la longueur des comptages/densité.
Pour résoudre ce problème, j’ai utilisé np.digitize pour quantifier l’entrée et renvoyer un nombre discret de bacs, ainsi que des fractions de décompte pour chaque bac. Vous pouvez facilement éditer pour obtenir le nombre entier de comptes.
def compute_PMF(data)
import numpy as np
from collections import Counter
_, bins = np.histogram(data, bins='auto', range=(data.min(), data.max()), density=False)
h = Counter(np.digitize(data,bins) - 1)
weights = np.asarray(list(h.values()))
weights = weights / weights.sum()
values = np.asarray(list(h.keys()))
return weights, values
####
Refs:
[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html