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

时间:2014-03-07 04:06:03

标签: 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()

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

enter image description here

对于不同的数组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()

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

enter image description here

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

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

更新

我正在尝试从Carsten König实施plotting histograms whose bar heights sum to 1 in matplotlib回答并得到非常奇怪的结果:

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()

结果:

enter image description here

我做错了什么?

由于

5 个答案:

答案 0 :(得分:13)

当您绘制标准化的直方图时,高度不应该总和为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]

这里,这个例子,bin宽度是0.1,曲线下方的面积总和为1(0.1 * 10)。

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

for item in p:
    item.set_height(item.get_height()/sum(x))

enter image description here

答案 1 :(得分:4)

一种方法是自己获取概率,然后使用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()

结果: enter image description here

答案 2 :(得分:1)

定义标准直方图,使得每列的宽度和高度的乘积之和等于总计数。这就是为什么你没有让你的最大值等于一。

但是,如果您仍想将其强制为1,则可以通过以下方式使用numpy和matplotlib.pyplot.bar

sample = np.random.normal(0,10,100)
#generate bins boundaries and heights
bin_height,bin_boundary = np.histogram(sample,bins=10)
#define width of each column
width = bin_boundary[1]-bin_boundary[0]
#standardize each column by dividing with the maximum height
bin_height = bin_height/float(max(bin_height))
#plot
plt.bar(bin_boundary[:-1],bin_height,width = width)
plt.show()

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

上面的行如何显示

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

当我有一个堆积的直方图时应该工作吗?-

n, bins, patches = plt.hist([from6to10, from10to14, from14to18, from18to22,  from22to6],
label= ['06:00-10:00','10:00-14:00','14:00-18:00','18:00- 22:00','22:00-06:00'],
stacked=True,edgecolor='black', alpha=0.8, linewidth=0.5, range=(np.nanmin(ref1arr),
stacked=True,edgecolor='black', alpha=0.8, linewidth=0.5, range=(np.nanmin(ref1arr), np.nanmax(ref1arr)), bins=10)