对于作业,我要求在直方图前面绘制高斯分布的直方图。问题很简单,因为我已经知道如何在直方图上绘制高斯图(以及如何绘制直方图)。
我已经有了这个:
#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]
以上所有内容均未显示数据直方图。
很抱歉。我没有注意到图像没有显示。这是指向他们的链接:
图1是扁平的。图2是可怕的一个。我想要完成的是一个类似高斯的直方图。
答案 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]: