如何在python中规范化直方图?

use*_*r40 5 python matplotlib normalization

我试图绘制标准直方图,但是在y轴上得到1作为最大值,我得到不同的数字.

对于数组k =(1,4,3,1)

 import numpy as np

 def plotGraph():

    import matplotlib.pyplot as plt

    k=(1,4,3,1)

    plt.hist(k, normed=1)

    from numpy import *
    plt.xticks( arange(10) ) # 10 ticks on x axis

    plt.show()  

plotGraph()
Run Code Online (Sandbox Code Playgroud)

我得到这个直方图,看起来不像诺曼.

在此输入图像描述

对于不同的数组k =(3,3,3,3)

 import numpy as np

 def plotGraph():

    import matplotlib.pyplot as plt

    k=(3,3,3,3)

    plt.hist(k, normed=1)

    from numpy import *
    plt.xticks( arange(10) ) # 10 ticks on x axis

    plt.show()  

plotGraph()
Run Code Online (Sandbox Code Playgroud)

我得到这个直方图,最大y值是10.

在此输入图像描述

对于不同的k,即使normed = 1或normed = True,我也得到不同的y的最大值.

为什么规范化(如果有效)会根据数据发生变化,如何使y的最大值等于1?

更新:

我试图通过在matplotlib中绘制条形高度总和为1的直方图来实现CarstenKönig的答案并得到非常奇怪的结果:

import numpy as np

def plotGraph():

    import matplotlib.pyplot as plt

    k=(1,4,3,1)

    weights = np.ones_like(k)/len(k)
    plt.hist(k, weights=weights)

    from numpy import *
    plt.xticks( arange(10) ) # 10 ticks on x axis

    plt.show()  

plotGraph()
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

我究竟做错了什么?

谢谢

CT *_*Zhu 15

当您绘制标准化的直方图时,高度不应该总和为1,但曲线下面的区域应总计为1:

In [44]:

import matplotlib.pyplot as plt
k=(3,3,3,3)
x, bins, p=plt.hist(k, density=True)  # used to be normed=True in older versions
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()  
In [45]:

print bins
[ 2.5  2.6  2.7  2.8  2.9  3.   3.1  3.2  3.3  3.4  3.5]
Run Code Online (Sandbox Code Playgroud)

这个例子中,箱宽为0.1,曲线下方的面积总和为1(0.1*10).

要将高度之和设为1,请在之前添加以下内容plt.show():

for item in p:
    item.set_height(item.get_height()/sum(x))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • OP可能只想知道如何绘制高度表示其可能性密度的条形图 (2认同)
  • `normed` 参数接受布尔值,所以它应该是 `normed=True`,现在不推荐使用 `density=True` (2认同)

upc*_*ric 10

您可以使用此处概述的解决方案:

weights = np.ones_like(myarray)/float(len(myarray))
plt.hist(myarray, weights=weights)
Run Code Online (Sandbox Code Playgroud)

  • 有什么大的区别吗?我只是想传达信息。 (8认同)

zha*_*hen 5

一种方法是自行获得概率,然后使用进行绘图plt.bar

In [91]: from collections import Counter
    ...: c=Counter(k)
    ...: print c
Counter({1: 2, 3: 1, 4: 1})

In [92]: plt.bar(prob.keys(), prob.values())
    ...: plt.show()
Run Code Online (Sandbox Code Playgroud)

结果: 在此处输入图片说明