Python:直方图,区域标准化为1以外的值

时间:2012-01-27 16:02:55

标签: python matplotlib histogram area

有没有办法告诉matplotlib“规范化”直方图,使其面积等于指定值(1除外)?

中的选项“normed = 0”
n, bins, patches = plt.hist(x, 50, normed=0, histtype='stepfilled')

只是将它带回频率分布。

2 个答案:

答案 0 :(得分:10)

只需计算并将其标准化为您想要的任何值,然后使用bar绘制直方图。

在旁注中,这将使所有条形的区域的标准化为normed_value。原始金额将normed_value(如果您愿意的话,很容易就是这种情况)。

E.g。

import numpy as np
import matplotlib.pyplot as plt

x = np.random.random(100)
normed_value = 2

hist, bins = np.histogram(x, bins=20, density=True)
widths = np.diff(bins)
hist *= normed_value

plt.bar(bins[:-1], hist, widths)
plt.show()

enter image description here

所以,在这种情况下,如果我们要整合(总和高度乘以宽度)的箱子,我们得到2.0而不是1.0。 (即(hist * widths).sum()将产生2.0

答案 1 :(得分:8)

您可以将weights参数传递给hist,而不是使用normed。例如,如果您的区间覆盖[minval, maxval]区间,则您有n个区间,并且您希望将区域标准化为A,那么我认为

weights = np.empty_like(x)
weights.fill(A * n / (maxval-minval) / x.size)
plt.hist(x, bins=n, range=(minval, maxval), weights=weights)

应该这样做。

编辑:weights参数的大小必须与x相同,其效果是使x中的每个值在weights中向bin计数提供相应的值,而不是1。

我认为hist函数可能会更好地控制规范化。例如,我认为当它正常时,标准化时会忽略分箱范围之外的值,这通常不是你想要的。