Есть ли чистый способ создания диаграммы гистограммы линии в Python?

Мне нужно создать гистограмму, которая отображает линию, а не шаг или гистограмму. Я использую python 2.7 plt.функция hist ниже строит ступенчатую линию, и бункеры не выстраиваются в 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)

Мне нужно, чтобы линия коррелировала с количеством каждого Бина в центрах Бина, как если бы был флаг histtype=u'Line, чтобы пойти с флагом align=u'Mid

3 ответов


используя scipy, вы могли бы использовать stats.gaussian_kde до оценить функцию плотности вероятности:

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', normed=True)  
plt.plot(x, density(x))
plt.show()

enter image description here


галерея миниатюр Matplotlib обычно очень полезно в таких ситуациях, как ваша. Сочетание этой и этот из галереи с некоторых настроек, вероятно, очень близко к тому, что вы имеете в виду:

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

кроме того, увеличение количества бункеров помогает...

enter image description here


сюжет вы производите не выстраиваются в качестве значений X используется складском края. Вы можете рассчитать бин-центры следующим образом:bin_centers = 0.5*(x[1:]+x[:-1]) Тогда полный код будет такой:

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

Если вы хотите, чтобы участок был заполнен до y=0, используйте plt.fill_between(bin_centers,n)Line histogram at bin centers