我需要创建一个绘制直线而不是步长或条形图的直方图。我正在使用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)
我需要该行与bin中心的每个bin计数相关联,就好像有一个histtype = u''标志与align = u' mid'标志
答案 0 :(得分:15)
使用scipy,你可以use stats.gaussian_kde
到estimate the probability density function:
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()
答案 1 :(得分:2)
Matplotlib's thumbnail gallery在像你这样的情况下通常很有帮助。图库中this和this one的组合与一些自定义可能非常接近您的想法:
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()
此外,增加垃圾箱数量有助于......
答案 2 :(得分:2)
您生成的线图不会排列,因为正在使用的x值是bin边。
您可以按如下方式计算bin中心: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()