【问题标题】:How to plot gaussian-like histogram (definitely NOT a gaussian over a histogram)?如何绘制类似高斯的直方图(绝对不是直方图上的高斯)?
【发布时间】:2017-09-16 00:21:43
【问题描述】:

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

我已经有了这个:

#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是可怕的。我想要完成的是一个类似高斯的直方图。

【问题讨论】:

  • 如果您谈论隐藏在某些输出中某处的问题,这对我们没有帮助,这显然不是您所期望的。请通过edit提出您的问题,明确说明您获得的输出不是您想要的以及您希望看到的。
  • 是的,感谢您的提醒。图片未显示。
  • 好吧,让我换种说法:直方图将样本数据作为输入,并计算它们在 bin 中的分布。如果样本数据来自正态分布,则直方图将具有高斯形状。您在这里所做的是将高斯形状放入直方图中。这完全没有意义,因为你没有解释你的期望,我认为这个问题应该简单地结束。
  • 你在说什么“明星”?

标签: python-2.7 matplotlib histogram gaussian


【解决方案1】:

好的,我自己想通了。这是我用来将高斯分布“转换”为直方图的算法。

当然它还有待优化,因为我是经过数小时的反复试验才提出这个想法的。

设 bins 和 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]:

http://imgur.com/a/uADK4

【讨论】:

  • 别忘了接受你的答案,这样这个问题就不会悬而未决。
猜你喜欢
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2022-01-06
  • 2018-02-17
  • 2019-06-24
  • 1970-01-01
  • 2021-10-15
相关资源
最近更新 更多