web-dev-qa-db-fra.com

Histogramme Matplotlib

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?

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

enter image description here

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

enter image description here

227
unutbu

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

histogram

20
Matthias123

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

enter image description here

Consultez également les galerie matplotlib et les exemples matplotlib .

12

Si vous êtes prêt à utiliser pandas :

pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')
6
Michael Malak

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

0
sirgogo