pyplot hist()频率直方图未标准化为1

时间:2014-07-22 18:19:02

标签: python matplotlib histogram

使用hist()时遇到问题。我创建了一个包含396个条目的数组,其中包含

的所有可能结果
X + 0.5 Y + Z,

其中0 <= X,Z <=50 <= Y <= 10。我想要创建的是频率直方图,其条形高度与在x,y,z独立,均匀分布的假设下获取某个值的概率一致。我以为我试试hist()

import pandas as pd
import matplotlib.pyplot as plt
def activity(x,y,z):
    return 1 * x + 0.5 * y + 1 * z

rangex = np.arange(6)
rangey = np.arange(11)
rangez = np.arange(6)
rhs = 10
activities = [activity(x,y,z) for x in rangex for y in rangey for z in rangez]
activities = pd.Series(activities)

fig, axes = plt.subplots(1,1)
n, bins, patches = axes.hist(activities, bins=np.linspace(-0.25, 15.25, num=32), \
                             normed=True)

这是奇怪的事情:n总计 2 !!! 通过选择bins,我确保每个项目恰好落入1个bin中,并且我知道确实需要31个bin,因为我的值范围是0到15,步长为0.5。

对不起,我无法简化这个例子。具有100个值的随机试验产生正确的频率。相反,这就是直方图的样子:bad normalization using pyplot.hist

从图中可以看出,频率总和不高于1.例如,在高度为0.1或更高的中心11条中。但是,红色图的频率总和为1。

我的问题:为什么我会出现错误的规范化?

见下面手动计算正确直方图的代码:

barposs, barheight = zip(*activities.value_counts(normalize=True).iteritems())
plt.bar(np.array(barposs) - 0.25, np.array(barheight), width=0.5, color='red')

我很感激任何有用的评论。

0 个答案:

没有答案