如何在 matplotlib 直方图中选择 bin
Posted
技术标签:
【中文标题】如何在 matplotlib 直方图中选择 bin【英文标题】:How to choose bins in matplotlib histogram 【发布时间】:2016-02-01 05:04:54 【问题描述】:有人可以向我解释直方图中的“bins”是什么(matplotlib hist 函数)吗?假设我需要绘制一些数据的概率密度函数,我选择的 bin 如何影响它?我该如何选择它们? (我已经在 matplotlib.pyplot.hist 和 numpy.histogram 库中阅读过它们,但我不明白)
【问题讨论】:
【参考方案1】:要补充jakes answer,您可以使用
numpy.histogram_bin_edges
如果您只想计算最佳 bin 边缘,而不实际执行直方图。 histogram_bin_edges
是专为优化 bin 边缘计算而设计的函数。您可以选择七种不同的算法进行优化。
【讨论】:
【参考方案2】:您认为 bin 的数量对近似真实基础分布有重大影响是正确的。我自己没有读过原论文,但根据Scott 1979,一个好的经验法则是使用:
R(n^(1/3))/(3.49σ)
在哪里
R 是数据范围(在您的情况下 R = 3-(-3)= 6),
n为样本数,
σ 是您的标准偏差。
【讨论】:
【参考方案3】:bins
参数告诉您数据将被分成多少个 bin。您可以将其指定为整数或 bin 边缘列表。
例如,这里我们要求 20 个箱子:
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1000)
plt.hist(x, bins=20)
这里我们要求位置 [-4, -3, -2... 3, 4] 的 bin 边缘。
plt.hist(x, bins=range(-4, 5))
您关于如何选择“最佳”数量的垃圾箱的问题是一个有趣的问题,实际上有相当多的关于该主题的文献。已经提出了一些常用的经验法则(例如Freedman-Diaconis Rule、Sturges' Rule, Scott's Rule, the Square-root rule 等),每个都有自己的优点和缺点。
如果您想要一个很好的 Python 实现各种这些自动调整直方图规则,您可以查看最新版本的 AstroPy 包described here 中的直方图功能。
这就像plt.hist
一样工作,但允许您使用类似的语法,例如hist(x, bins='freedman')
用于通过上述 Freedman-Diaconis 规则选择垃圾箱。
我个人最喜欢的是“贝叶斯块”(bins="blocks"
),它解决了 不等 分箱宽度的最佳分箱问题。您可以阅读更多关于 here 的内容。
编辑,2017 年 4 月:使用 matplotlib 2.0 或更高版本和 numpy 1.11 或更高版本,您现在可以直接在 matplotlib 中指定自动确定的 bin,通过指定,例如bins='auto'
。这使用了 Sturges 和 Freedman-Diaconis bin 选择的最大值。您可以在numpy.histogram
docs 中阅读有关选项的更多信息。
【讨论】:
非常感谢!我的数据大约有 10 万个点,我需要绘制它的概率密度函数。因为我的数据有很多小数字,所以我使用了这个: bin_size = 0.1; min_edge = -5.; max_edge = 5. N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1 bins = np.linspace(min_edge, max_edge, Nplus1) 如果在 Matplotlib 或 NumPy 或 SciPy 或 Pandas 或其他标准数据科学包之一中也能自动进行不等分箱,那就太好了。【参考方案4】:Bins 是您希望将所有数据划分为的区间数,以便在直方图上显示为条形。计算适合多少个 bin 的一种简单方法是取分布中值总数的平方根。
【讨论】:
以上是关于如何在 matplotlib 直方图中选择 bin的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 matplotlib 在单独的图形上创建多个直方图?