有没有一种干净的方法来生成Python中的线性直方图?

Dan*_*ick 12 python plot histogram

我需要创建一个绘制直线而不是步长或条形图的直方图.我正在使用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)
Run Code Online (Sandbox Code Playgroud)

我需要该行与bin中心的每个bin的计数相关联,就好像有一个histt​​ype = u'line'标志与align = u'mid'标志一起去

unu*_*tbu 17

使用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', density=True)  
plt.plot(x, density(x))
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @Shushiro:曲线是概率分布的估计。您可以认为这些曲线已缩放以确保其曲线下的面积为1。 (2认同)

小智 8

您生成的线图未对齐,因为使用的 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()
Run Code Online (Sandbox Code Playgroud)

如果您希望将绘图填充为 y=0,则使用 plt.fill_between(bin_centers,n)bin 中心的线直方图


mty*_*mty 7

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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

此外,增加垃圾箱的数量有助于...

在此处输入图片说明