趋近智
直方图是理解数据分布的一种基本可视化工具。它们显示落在特定范围内的数据点的频率(或计数),从而直观地展示数据的分布情况。在 Python 中,plt.hist() 通常用于创建这些可视化图表。直方图中的条形代表这些频率,每个条形对应一个特定的值范围。这些范围被称为分箱。可以将分箱想象成沿数轴排列的容器;每个数据点都会根据其值放入相应的容器中。每个容器条形的高度表示其容纳的数据点数量。
了解和控制这些分箱对制作信息量大的直方图非常重要。分箱的选择会很大程度上改变直方图的外观,进而影响对数据分布的理解。
每个分箱覆盖数据取值范围内的特定区间。例如,如果您的数据范围是0到100,您可能会有覆盖0-10、10-20、20-30等的分箱。一个值为15的数据点会落入10-20的分箱中,增加该分箱的计数(从而增加条形的高度)。
默认情况下,Matplotlib的 plt.hist() 函数会尝试为数据选择一个合理的分箱数量。但这个默认值并非总是最理想的。
我们来看看改变分箱数量如何影响生成的直方图。我们将使用从正态分布中抽取的一些样本数据。
import matplotlib.pyplot as plt
import numpy as np
# 生成一些样本数据
np.random.seed(42) # 为了结果可复现
data = np.random.randn(200) * 1.5 + 5 # 200个点,均值=5,标准差=1.5
# --- 绘制不同分箱数量的图 ---
plt.figure(figsize=(12, 4)) # 创建一个图表以容纳子图
# 图1: 分箱过少
plt.subplot(1, 3, 1) # (行数,列数,面板编号)
plt.hist(data, bins=5, color='#228be6', edgecolor='white')
plt.title('分箱过少 (bins=5)')
plt.xlabel('值')
plt.ylabel('频率')
# 图2: 默认分箱数量 (Matplotlib 决定)
plt.subplot(1, 3, 2)
plt.hist(data, color='#15aabf', edgecolor='white') # 让 Matplotlib 选择分箱
plt.title('默认分箱')
plt.xlabel('值')
# plt.ylabel('频率') # (可选)隐藏中间图的Y轴标签
# 图3: 分箱过多
plt.subplot(1, 3, 3)
plt.hist(data, bins=50, color='#40c057', edgecolor='white')
plt.title('分箱过多 (bins=50)')
plt.xlabel('值')
# plt.ylabel('频率') # (可选)隐藏Y轴标签
plt.tight_layout() # 调整布局以防止重叠
plt.show()
从上面代码生成的图中可以看出:
我们用交互式图表来比较一下。
使用5个分箱的直方图。整体形状得以呈现,但细节有所丢失。
使用Matplotlib默认分箱数量的直方图。这通常提供了一个合理的起点。
使用50个分箱的直方图。这显示了过多的细节和噪声,使得数据本身的模式更难看出。
您可以使用 bins 参数在 plt.hist() 中控制分箱:
指定分箱数量: 将一个整数传递给 bins 参数。Matplotlib会创建指定数量的等宽分箱,覆盖数据取值范围。
# 创建一个包含20个分箱的直方图
plt.hist(data, bins=20, color='#845ef7', edgecolor='black')
plt.title('20个分箱的直方图')
plt.xlabel('值')
plt.ylabel('频率')
plt.show()
指定分箱边缘: 传递一个列表或NumPy数组,用于定义每个分箱的确切边界(边缘)。这使您可以精确控制分箱的起始和结束位置。如果您提供 个边缘,您将得到 个分箱。
# 定义特定的分箱边缘
bin_edges = [0, 2, 4, 6, 8, 10] # 创建分箱:[0,2), [2,4), [4,6), [6,8), [8,10]
plt.hist(data, bins=bin_edges, color='#f76707', edgecolor='black')
plt.title('自定义分箱边缘的直方图')
plt.xlabel('值')
plt.ylabel('频率')
plt.xticks(bin_edges) # 将x轴刻度设置为与分箱边缘匹配,以便清晰显示
plt.show()
注意: 符号 [0, 2) 表示分箱包含0但不包含2(最后一个分箱除外,它包含两个边缘)。
那么,应该使用多少个分箱呢?遗憾的是,没有一个完美的答案。这通常需要一定的判断,并取决于:
一般建议:
选择合适的分箱是一项通过经验获得的实用技能。不要害怕尝试不同的值,直到直方图能够有效呈现数据本身的模式。
这部分内容有帮助吗?
bins 参数及其各种分箱选择方法。© 2026 ApX Machine Learning用心打造