大家好,我是你们的小帅学长。
很多人会画直方图,但很少有人真的“会”画直方图。
尤其是一个问题:bin 到底怎么选?选少了,图像过度平滑,结构被掩盖。选多了,图像噪声爆炸,看起来像“心电图”。
今天这篇,我们就把直方图讲清楚,不仅告诉你“怎么选”,还给你可以直接用的规则。
01.直方图到底在看什么?
直方图(Histogram)本质是在回答一个问题:数据是怎么分布的?
它关注的是:是否对称?是否偏态?是否多峰?是否存在异常值?数据是否接近正态?
它不是看“平均值”,也不是看“比例”,而是看分布结构。
而决定你能不能看清结构的关键,就是——bin(分箱数)
02.bin 是什么?为什么这么重要?
bin = 把连续变量切成多少段。
举个简单例子:假设你有 1000 个身高数据。
分成 5 个箱子 → 很粗糙
分成 50 个箱子 → 很碎
分成 100 个箱子 → 噪声满屏
所以,bin 决定了你看到的是“趋势”还是“噪声”。
情况1:bin 太少
多峰变单峰
偏态看不出来
细节被抹平
你以为数据很稳定,其实它暗流涌动。
情况2:bin 太多
图像变锯齿
噪声被当结构
读者理解成本极高
你以为自己很精细,其实是过拟合视觉。
04.bin 怎么选?给你规则
规则1:Sturges 法则(适合小样本)
公式:k = log₂(n) + 1
n 是样本量;k 是分箱数
适合:n < 200;分布接近正态
优点:简单
缺点:大样本会偏少
规则2:平方根法
k = √n
比如:100 个数据 → 10 个箱;10000 个数据 → 100 个箱
优点:简单好记;实用性强
规则3:Freedman–Diaconis 法
核心思想:用 IQR(四分位距)决定箱宽,而不是主观拍脑袋。
公式:
R:breaks = "FD"
Python seaborn:bins="fd"
优点:对异常值不敏感;大样本稳定;更科学
05.什么时候该手动调整?
即便有规则,也别盲信。
以下情况建议人工观察:
你怀疑数据多峰的时候——建议适当增加 bin,看是否出现结构。
你做展示而非论文的时候——建议可读性优先。
数据极度偏态的时候——建议考虑对数变换再画。
import numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 设置随机种子np.random.seed(42)# 构造一个“略微复杂”的分布(双峰)data = np.concatenate([ np.random.normal(0, 1, 500), np.random.normal(4, 1.5, 500)])# 样本量n = len(data)# 三种 bin 规则sturges_bins = int(np.log2(n) + 1)sqrt_bins = int(np.sqrt(n))# 创建画布plt.figure(figsize=(15, 4))# 1. Sturgesplt.subplot(1, 3, 1)plt.hist(data, bins=sturges_bins, edgecolor='black')plt.title(f"Sturges Rule\nbins = {sturges_bins}")plt.xlabel("Value")plt.ylabel("Frequency")# 2️.平方根法plt.subplot(1, 3, 2)plt.hist(data, bins=sqrt_bins, edgecolor='black')plt.title(f"Square Root Rule\nbins = {sqrt_bins}")plt.xlabel("Value")# 3️. Freedman-Diaconisplt.subplot(1, 3, 3)plt.hist(data, bins='fd', edgecolor='black')plt.title("Freedman-Diaconis Rule")plt.xlabel("Value")plt.tight_layout()plt.show()
07.常见误区
误区 1:bin 越多越专业
误区 2:软件默认就是最佳
误区 3:所有数据都适合直方图
直方图适合连续变量、样本量足够、想看整体形态;不适合分类变量、极小样本。
直方图不是随便画的,它是分箱规则与数据结构之间的博弈。选 bin,本质是在平滑趋势、保留结构和控制噪声,这就是统计思维。
直方图是“分箱的分布表达”,但如果我们想不依赖箱子、更平滑地表达概率密度、看出更细腻的形态,那就要学习《KDE密度图》。下一篇,我会告诉你:KDE 为什么更“优雅”、带宽怎么选、什么时候 KDE 会误导你。
——期待你的关注——
往期内容:
用Python做科研级画图——哑铃图
用Python做科研级画图——点图替代柱状
用Python做科研级画图——分组对比
用Python做科研级画图——柱状图基础
用Python做科研级画图——折线图基础模板