我正在创建按数据帧组织并按天分组的数据直方图。在某些情况下,数据可能完全为空。因此,当我使用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)
编辑:我现在发现属性normed
已过时。但是,如果尝试使用属性density
,则会收到错误AttributeError: Unknown property density
答案 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)
使用jdehesa的建议,按照您的方式进行操作
l = plt.hist(data,density = True, bins=np.arange(-10, 11))
使用基于DavidG答案的this的建议,您的身高为1,但面积未标准化为1。
weights = np.ones_like(data)/float(len(data))
l = plt.hist(data,weights=weights)
最后,如果需要高度1和宽度1(因此area = 1)以及标准化区域,则可以将单个bin用作
l = plt.hist(data, density=True, bins=1)
plt.xlim(-10, 10)
答案 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')
结果:
您还可以创建一个直方图,其中每个bin的宽度为1,但这是一个更有限的解决方案。
编辑:如其他答案所指出,这基本上等效于为weight
提供适当的plt.hist
参数。