如何在matplotlib直方图中选择bin

时间:2015-11-01 02:13:33

标签: python python-2.7 matplotlib

有人可以向我解释直方图中的“bins”是什么(matplotlib hist函数)?假设我需要绘制一些数据的概率密度函数,我选择的箱子如何影响那个?我该如何选择它们? (我已经在matplotlib.pyplot.histnumpy.histogram图书馆中了解过它们,但我没有得到这个想法)

4 个答案:

答案 0 :(得分:36)

bins参数告诉您数据将被分成的区域数。您可以将其指定为整数或bin边缘列表。

例如,这里我们要20个箱子:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(1000)
plt.hist(x, bins=20)

enter image description here

这里我们要求位置[-4,-3,-2 ... 3,4]处的bin边缘。

plt.hist(x, bins=range(-4, 5))

enter image description here

关于如何选择" best"的问题箱子的数量是一个有趣的,并且实际上有关于这个主题的相当广泛的文献。已经提出了一些常用的经验法则(例如Freedman-Diaconis RuleSturges' Rule, Scott's Rule, the Square-root rule等),每个都有自己的优点和缺点。

如果你想要一个很好的Python实现各种这些自动调整直方图规则,你可以在最新版本的AstroPy包described here中查看直方图功能。 这与plt.hist类似,但允许您使用类似的语法,例如hist(x, bins='freedman')通过上述Freedman-Diaconis规则选择垃圾箱。

我个人最喜欢的是"贝叶斯块" (bins="blocks"),它解决了不等 bin宽度的最佳分箱。您可以在here上阅读更多内容。

编辑,2017年4月:使用matplotlib版本2.0或更高版本以及numpy版本1.11或更高版本,您现在可以直接在matplotlib中指定自动确定的bin,方法是指定,例如: bins='auto'。这使用了Sturges和Freedman-Diaconis bin的最大选择。您可以在numpy.histogram docs中了解有关这些选项的更多信息。

答案 1 :(得分:4)

Bins是您想要将所有数据划分为的间隔数,以便它可以在直方图上显示为条形。使用多少个分箱的简单方法是获取分布中值总数的平方根。

答案 2 :(得分:1)

您认为箱数对近似真实基础分布有重大影响,这是正确的。我自己没有读过原始论文,但根据Scott 1979,一个好的经验法则是使用:

  

R(N ^(1/3))/(3.49σ)

其中

  • R 是数据范围(在您的情况下 R = 3 - ( - 3)= 6 ),

  • n 是样本数量,

  • σ是您的标准偏差。

答案 3 :(得分:0)

要补充jakes answer,可以使用 numpy.histogram_bin_edges,如果您只想计算最佳bin边缘,而无需实际执行直方图。 histogram_bin_edges是专门为优化仓边计算而设计的功能。您可以选择七个不同的算法进行优化。