matplotlib.pyplot.hist错误的规范属性

时间:2018-10-30 11:23:46

标签: python matplotlib plot histogram

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

代码示例和输出:

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

enter image description here

编辑:我现在发现属性normed已过时。但是,如果尝试使用属性density,则会收到错误AttributeError: Unknown property density

2 个答案:

答案 0 :(得分:2)

您看到的图是正确的,因为曲线下的面积(直方图/条形图)应为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=True用作

,也会发生同样的情况
l = plt.hist(data,density = True, bins = 100)

enter image description here

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

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

enter image description here

使用基于DavidG答案的this的建议,您的身高为1,但面积未标准化为1。

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

enter image description here

最后,如果需要高度1和宽度1(因此area = 1)以及标准化区域,则可以将单个bin用作

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

enter image description here

答案 1 :(得分:0)

正如其他人所解释的那样,normed=True(或最新版本的Matplotlib中的density=True)使直方图下的面积等于1。您可以得到直方图,该直方图表示落在样品上的部分每个垃圾箱都是这样的:

import matplotlib.pyplot as plt
import numpy as np

data = np.zeros((1000))
# Compute histogram
hist, bins = np.histogram(data, density=True, bins=100)
# Width of each bin
bins_w = np.diff(bins)
# Compute proportion of sample in each bin
hist_p = hist * bins_w
# Plot histogram
plt.bar(bins[:-1], hist_p, width=bins_w, align='edge')

结果:

Histogram of fractions

您还可以创建一个直方图,其中每个bin的宽度为1,但这是一个更有限的解决方案。

编辑:如其他答案所指出,这基本上等效于为weight提供适当的plt.hist参数。