cho*_*o14 7 python plot matplotlib histogram
我正在创建在数据框中组织并按天分组的数据直方图。有时可能会出现数据完全为空的情况。因此,当我使用该属性绘制直方图时normed = True,我期望有一个以 0 为中心且高度等于 1 的 bin。但是,我发现高度等于 bin 的数量。我怎样才能解决这个问题?我想用直方图来表示概率密度函数,所以最大值应该是1。
代码示例和输出:
plt.rcParams['figure.figsize'] = 10, 4
data = np.zeros((1000))
l = plt.hist(data,normed = True, bins = 100)
Run Code Online (Sandbox Code Playgroud)
编辑:我现在看到该属性normed已被弃用。但是,如果我尝试使用该属性density,则会收到错误AttributeError: Unknown property density
您看到的图是正确的,因为曲线下的面积(直方图/条形图)应该为 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)
Run Code Online (Sandbox Code Playgroud)
如果您使用density=Trueas也会发生同样的情况
l = plt.hist(data,density = True, bins = 100)
Run Code Online (Sandbox Code Playgroud)
使用jdehesa的建议,以下工作按您的方式进行
l = plt.hist(data,density = True, bins=np.arange(-10, 11))
Run Code Online (Sandbox Code Playgroud)
使用DavidG基于此答案的建议可以得到高度 1,但面积未标准化为 1。
weights = np.ones_like(data)/float(len(data))
l = plt.hist(data,weights=weights)
Run Code Online (Sandbox Code Playgroud)
最后,如果您需要高度为 1、宽度为 1(因此面积 = 1)以及标准化面积,则可以使用单个 bin 作为
l = plt.hist(data, density=True, bins=1)
plt.xlim(-10, 10)
Run Code Online (Sandbox Code Playgroud)
正如其他人所解释的那样,normed=True(或density=True在 Matplotlib 的最新版本中)使直方图下的面积等于 1。您可以获得表示落在每个 bin 上的样本分数的直方图,如下所示:
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')
Run Code Online (Sandbox Code Playgroud)
结果:
您还可以制作一个直方图,其中每个 bin 的宽度为 1,但这是一个更有限的解决方案。
编辑:正如其他答案中所指出的,这基本上相当于为 提供适当的weights参数plt.hist。