如何绘制类似高斯的直方图(绝对不是直方图上的高斯)?

时间:2017-04-19 16:33:36

标签: python-2.7 matplotlib histogram gaussian

对于作业,我要求在直方图前面绘制高斯分布的直方图。问题很简单,因为我已经知道如何在直方图上绘制高斯图(以及如何绘制直方图)。

我已经有了这个:

#bins=array that indicates the boundaries of the bars
#array is an object with attributes such as; standard deviation (stdv); mean or average (mean).

In [63]: 1/(array.stdv*np.sqrt(2*np.pi))*np.exp(-(bins-array.mean)**2/(2*array.stdv**2))
Out[63]: 
array([  1.46863468e-03,   1.71347711e-03,   1.99065837e-03, ...,
         5.37698408e-15,   3.25989619e-15,   1.96798911e-15])

In [64]: bins
Out[64]: array([  33.,   34.,   35., ...,  187.,  188.,  189.])

当我尝试用此绘图时,我得到:

In [59]: plt.hist(1/(array.stdv*np.sqrt(2*np.pi))*np.exp(-(bins-array.mean)**2/(2*array.stdv**2)),bins,range=(min(histmain.array),max(histmain.array)),histtype='step')
Out[59]: 
(array([ 0.,  0.,  0., ...,  0.,  0.,  0.]),
 array([  33.,   34.,   35., ...,  187.,  188.,  189.]),
 <a list of 1 Patch objects>)

[Figure][1]

我想我已经知道了这个问题。我想hist函数接收一个数据数组,并根据频率绘制。我所拥有的是一系列频率。我尝试将函数乘以3200,但我得到的是这种暴行:

In [61]: plt.hist(3200/(array.stdv*np.sqrt(2*np.pi))*np.exp(-(bins-array.mean)**2/(2*array.stdv**2)),bins,range=(min(histmain.array),max(histmain.array)))
Out[61]: 
(array([ 1.,  1.,  0., ...,  0.,  0.,  0.]),
 array([  33.,   34.,   35., ...,  187.,  188.,  189.]),
 <a list of 156 Patch objects>)

[Figure][2]

以上所有内容均未显示数据直方图。

很抱歉。我没有注意到图像没有显示。这是指向他们的链接:

enter image description here

enter image description here

图1是扁平的。图2是可怕的一个。我想要完成的是一个类似高斯的直方图。

1 个答案:

答案 0 :(得分:1)

好的,我自己想通了。这是我过去用来转换&#39;的算法。高斯分布到直方图中。

当然,由于我在经过数小时的反复试验后提出了这个想法,因此尚未进行优化。

让bin和gauss分别是bin分布和每个bin左侧的概率分布。

首先,我创建了一个包含每个bin的平均概率的列表:

for i in range(len(gauss)):
    try:
        avrgeprob.append((gauss[i]+gauss[i+1])/2)
    except IndexError:
        avrgeprob.append(gauss[i])

其次,我使用每个bin的预期频率创建了另一个列表(我用来测试它的数组中有3200个值)

for x in avrgeprob:
    expfreq.append(3200*x)

你可以看到

In [121]: sum(expfreq)
Out[121]: 3173.5316995750118

所以它非常接近。第三,我创建了一个最后一个列表,其中包含每个bean的较低值,与预期一样多次

for i in range(len(bins)):
     if int(expfreq[i])!=0:
         fakelist+=[bins[i]]*int(expfreq[i])
     else:
         fakelist.append(0)

毕竟,我让魔法发生了:

In [122]: plt.hist(fakelist,bins=bins,histtype=u'step')
Out[122]:

enter image description here http://imgur.com/a/uADK4