web-dev-qa-db-fra.com

Existe-t-il un moyen propre de générer un histogramme linéaire en Python?

J'ai besoin de créer un histogramme qui trace une ligne et non un graphique en étapes ou en barres. J'utilise python 2.7 La fonction plt.hist ci-dessous trace une ligne en escalier et les bacs ne s'alignent pas dans la fonction plt.plot.

import matplotlib.pyplot as plt
import numpy as np
noise = np.random.normal(0,1,(1000,1))
(n,x,_) = plt.hist(noise, bins = np.linspace(-3,3,7), histtype=u'step' )  
plt.plot(x[:-1],n)

J'ai besoin que la ligne soit en corrélation avec le nombre de chaque casier au centre des casiers comme s'il y avait un indicateur histtype = u'line 'pour aller avec le drapeau align = u'mid'

15
DanGoodrick

En utilisant scipy, vous pourriez tilisez stats.gaussian_kde à estimer la fonction de densité de probabilité :

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

noise = np.random.normal(0, 1, (1000, ))
density = stats.gaussian_kde(noise)
n, x, _ = plt.hist(noise, bins=np.linspace(-3, 3, 50), 
                   histtype=u'step', density=True)  
plt.plot(x, density(x))
plt.show()

enter image description here

16
unutbu

Le tracé de ligne que vous produisez ne s'aligne pas car les valeurs x utilisées sont les bords du bac. Vous pouvez calculer les centres de bacs comme suit: bin_centers = 0.5*(x[1:]+x[:-1]) Alors le code complet serait:

noise = np.random.normal(0,1,(1000,1))
n,x,_ = plt.hist(noise, bins = np.linspace(-3,3,7), histtype=u'step' )
bin_centers = 0.5*(x[1:]+x[:-1])
plt.plot(bin_centers,n) ## using bin_centers rather than edges
plt.show()

Si vous voulez que le tracé soit rempli à y = 0, utilisez plt.fill_between(bin_centers,n)Line histogram at bin centers

3
MattB

la galerie de miniatures de Matplotlib est généralement très utile dans des situations comme la vôtre. Une combinaison de this et this one de la galerie avec quelques personnalisations est probablement très proche de ce que vous avez en tête:

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

mu = 0
sigma = 1
noise = np.random.normal(mu, sigma, size=1000)
num_bins = 7
n, bins, _ = plt.hist(noise, num_bins, normed=1, histtype='step')
y = mlab.normpdf(bins, mu, sigma)
plt.plot(bins, y, 'r--')
plt.show()

enter image description here

De plus, l'augmentation du nombre de bacs aide ...

enter image description here

2
mty