有没有办法告诉matplotlib“规范化”直方图,使其面积等于指定值(1除外)?
中的选项“normed = 0”
n, bins, patches = plt.hist(x, 50, normed=0, histtype='stepfilled')
只是将它带回频率分布。
答案 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()
所以,在这种情况下,如果我们要整合(总和高度乘以宽度)的箱子,我们得到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
函数可能会更好地控制规范化。例如,我认为当它正常时,标准化时会忽略分箱范围之外的值,这通常不是你想要的。