直方图中的频率

时间:2020-04-17 06:21:30

标签: python matplotlib sampling

这是我的第一篇文章,所以请忍受我

这是代码

plt.figure()
ax1 = plt.subplot()
sample = np.random.normal(loc=0.0, scale=1.0, size=100)
ax1.hist(sample,bins=100)
ax1.set_title('n={}'.format(sample_size))  
print(len(np.unique(sample))) ##outputs 100 as expected

我的疑问是,如果我给出bins=100并且样本数也是100,那么为什么它不为每个样本绘制条形图,为什么输出图包含的频率大于1?

1 个答案:

答案 0 :(得分:0)

使用默认参数,所有垃圾箱的宽度相同。 100槽表示每个槽的宽度为总宽度的1/100。总宽度从样本列表的最小到最大。

由于边界的选择,至少一个点将在第一个容器中结束,一个在最后一个容器中结束,但是大多数将在中央容器中结束,并且许多最外面的容器保持为空。

通常需要使所有垃圾箱具有相同的宽度。直方图想要显示在哪个区域中有更多的样本,在哪里有较少的样本,无论是一个峰还是多个峰。通常,要传达有关数据的有趣信息,箱的数量应比样本数少得多。

以下是说明发生的情况的图表。由于100箱创建了一个非常拥挤的地块,因此该示例仅使用20个样本和20箱。如此少的样本,它们将比更多样本更多地散布。 hist返回3个数组:一个数组包含每个容器的内容,一个数组具有容器之间的边界(这是容器数量的一个多),而另一个则包含图形对象(矩形面片)。边界可用于显示其位置。

import matplotlib.pyplot as plt
import numpy as np

N = 20
plt.figure()
ax1 = plt.subplot()
sample = np.random.normal(loc=0.0, scale=1.0, size=N)
bin_values, bin_bounds, _ =  ax1.hist(sample, bins=N, label='Histogram')
ax1.set_title(f'{len(np.unique(sample))} samples')
ax1.plot(np.repeat(bin_bounds, 3), np.tile([0, -1, np.nan], len(bin_bounds)), label='Bin boundaries' )
ax1.scatter(sample, np.full_like(sample, -0.5), facecolor='none', edgecolor='crimson', label='Sample values')
ax1.axhline(0, color='black')
plt.legend()
plt.show()

explanatory plot

这是100个样本和100个容器的样子:

plot with 100 bins