首页 > 解决方案 > matplotlib.pyplot.hist 错误的规范属性

问题描述

我正在创建在数据框中组织并按天分组的数据直方图。在某些日子里,数据可能完全为空。因此,当我使用该属性绘制直方图时normed = True,我希望有一个以零为中心且高度等于 1 的 bin。但是,我看到高度等于 bin 的数量。我怎样才能解决这个问题?我想用直方图表示一个概率密度函数,所以最大值应该是1。

代码示例和输出:

plt.rcParams['figure.figsize'] = 10, 4
data = np.zeros((1000))
l = plt.hist(data,normed = True, bins = 100)

在此处输入图像描述

编辑:我现在看到该属性normed已被弃用。但是,如果我尝试使用属性density,我会收到错误AttributeError: Unknown property density

标签: pythonmatplotlibplothistogram

解决方案


您看到的图是正确的,因为曲线下的面积(直方图/条形图)应该是 1。在您的图中确实是这种情况。为了突出这一点,我在 处创建了一条垂直线,x=0.01您会注意到条形的宽度确实为 0.01。由于条形的高度为 100,因此面积为 100 * 0.01 = 1。

plt.rcParams['figure.figsize'] = 10, 4
data = np.zeros((1000))
l = plt.hist(data,normed = True, bins = 100)
plt.axvline(0.01, lw=1)
plt.ylim(0, 150)

如果您使用density=Trueas

l = plt.hist(data,density = True, bins = 100)

在此处输入图像描述

使用jdehesa的建议,您可以按照自己的方式进行操作

l = plt.hist(data,density = True, bins=np.arange(-10, 11))

在此处输入图像描述

根据此答案使用DavidG的建议,您的高度为 1,但该区域未标准化为 1。

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

在此处输入图像描述

最后,如果您需要 1 的高度和 1 的宽度(因此面积 = 1)以及标准化面积,您可以使用单个 bin 作为

l = plt.hist(data, density=True, bins=1)
plt.xlim(-10, 10)

在此处输入图像描述


推荐阅读