直方图分箱数选择有五种主流方法:一、sturges公式法(k=1+log₂n,matplotlib默认);二、freedman-diaconis规则(基于iqr与n^(−1/3),抗异常值);三、scott规则(基于标准差与n^(−1/3),最小化amise);四、matplotlib的bins='auto'(自动选fd、scott、sturges中最大k);五、r语言dpih函数(直接插件法优化imse)。

直方图是展示数据分布形态的基础工具,而分箱数(bins)的选择直接影响可视化效果与信息传达准确性。若分箱过少,会掩盖数据细节;若过多,则引入噪声、干扰真实分布趋势。以下是几种主流方法,用于通过histogram函数或相关机制自动确定最佳分箱数。
一、Sturges公式法
该方法基于样本量N推导理论最优组数,假设数据近似服从正态分布,计算简洁且被Matplotlib默认采用(当未显式指定bins时)。其核心逻辑是使分组数量足以分辨分布结构,又避免过度细分。
1、计算样本总数N,使用Python中len(data)获取。
2、代入公式K = 1 + log₂(N),等价于1 + 3.322 × log₁₀(N)。
3、对结果四舍五入取整,得到整数分箱数K。
4、在matplotlib.pyplot.hist()中传入bins=K参数,例如:plt.hist(data, bins=round(1 + 3.322 * np.log10(len(data))))。
二、Freedman-Diaconis规则(FD规则)
该方法不依赖正态假设,而是利用数据的离散程度——四分位距(IQR)和样本量共同决定箱宽,再反推分箱数,对异常值鲁棒性强,适合偏态或重尾分布。
1、计算数据的下四分位数Q1与上四分位数Q3,再得IQR = Q3 − Q1。
2、计算箱宽d = 2 × IQR × N^(−1/3)。
3、计算全距R = max(data) − min(data)。
4、分箱数K = round(R / d),确保为正整数。
5、调用hist函数时显式指定bins=K,例如:plt.hist(data, bins=int((np.max(data)-np.min(data)) / (2 * iqr(data) * len(data)**(-1/3))))。
三、Scott规则
该规则以标准差σ为尺度,假设数据接近正态分布,推导出最小渐近均方误差(AMISE)下的最优箱宽,进而得出分箱数,广泛用于统计软件默认设置。
1、计算样本标准差σ,使用np.std(data, ddof=0)。
2、计算箱宽d = 3.5 × σ × N^(−1/3)。
3、计算全距R = max(data) − min(data)。
4、分箱数K = round(R / d)。
5、在绘图中直接传入该K值,例如:plt.hist(data, bins=int((np.max(data)-np.min(data)) / (3.5 * np.std(data) * len(data)**(-1/3))))。
四、自动选择接口:Matplotlib内置auto选项
Matplotlib 2.0.2及以上版本支持bins='auto'参数,内部按顺序尝试Fd规则、Scott规则与Sturges公式,选取其中分箱数最大的一个作为最终结果,兼顾鲁棒性与分辨率。
1、准备数值型数组data。
2、调用plt.hist(data, bins='auto')。
3、该调用将自动完成分布评估与分箱数决策,无需手动计算。
4、可进一步通过返回值获取实际使用的分箱数:n, bins, patches = plt.hist(data, bins='auto'),其中len(bins)−1即为所选分箱数。
五、R语言dpih函数法
R语言KernSmooth包中的dpih函数采用直接插件法(Direct Plug-in),通过高阶导数估计与带宽优化,迭代求解最小化积分均方误差(IMSE)的最优箱宽,精度高于前述经验规则,适用于研究级分析。
1、在R中安装并加载KernSmooth包:install.packages("KernSmooth"); library(KernSmooth)。
2、生成数据向量x,例如x
3、调用dpih(x)获取最优带宽h,再计算分箱数:bins_num 。
4、使用hist(x, breaks=bins_num)绘制直方图。











