一、前言
直方图(Histogram)是一种用柱状图形表示数据分布的统计图表,它将数据划分为连续的区间(称为"分箱"或"区间"),统计每个区间内的数据频数(或频率),并用柱形的高度直观展示数据分布情况。
二、常用场景
-
数据分布分析
-
观察数据集中趋势(如集中在哪个区间)、离散程度(如是否对称、是否存在长尾)或异常值。
-
例:分析某班级学生考试成绩的分布,判断是否接近正态分布。
-
-
图像处理
-
分析图像像素的亮度或颜色分布,辅助调整对比度、曝光或均衡化。
-
例:Photoshop 中的直方图可帮助摄影师优化照片的明暗细节。
-
-
质量控制
-
监测生产过程中产品的规格(如零件尺寸)是否符合标准。
-
例:统计工厂生产的螺丝长度是否集中在目标值附近。
-
-
市场研究
-
分析用户行为数据(如购物金额、使用时长)的分布特征。
-
例:统计电商用户的消费金额区间,识别主要消费群体。
-
-
自然科学
-
研究实验数据的分布规律(如气温变化、生物特征测量)。
-
例:统计某地区每日降雨量的分布,研究气候特征。
-
三、直方图的优势
-
直观展示数据分布:快速识别数据是否对称、是否多峰、是否存在偏态。
-
发现异常值:通过离群区间判断数据中的极端值。
-
辅助决策:帮助调整数据处理策略(如是否需要数据分箱、归一化)。
示例
假设统计100人的月收入(单位:千元),直方图可能显示:
-
区间0-5:10人
-
区间5-10:35人
-
区间10-15:40人
-
区间15-20:15人
由此可看出收入集中在5-15千元,呈近似正态分布。
通过直方图,复杂的数值分布规律变得一目了然。
四、基本使用
python
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.style as ms
# 设置主题风格
# classic、fast、petroff10、seaborn-v0_8-colorblind
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='高二男生、女士各科平均成绩', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
scores = []
'''
np.random.randint:NumPy 中生成随机整数的函数。
参数:0:最小值(包含该值)。
100:最大值(不包含该值,实际生成的数是 0 ≤ 值 < 100)。
50:生成的随机整数数量。'''
scores.append(np.random.randint(0, 100, 50))
scores.append(np.random.randint(0, 100, 50))
# stacked: 允许堆积,histtype:直方图类型
plt.hist(x=scores, bins=12, histtype='barstacked', stacked=True)
plt.show()

五、灰度直方图
应用场景
-
对比度增强:如直方图均衡化,通过重新分布灰度值提升图像细节。
-
图像分割:利用双峰直方图选取阈值,分离前景与背景。
-
曝光评估:摄影中检查过曝(右侧溢出)或欠曝(左侧溢出)问题。
-
图像分类:作为特征描述符辅助内容检索或分类。
python
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as ms
# 设置主题风格
# classic、fast、petroff10、seaborn-v0_8-colorblind
ms.use('seaborn-v0_8-colorblind')
plt.figure(num=' ', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
random_state = np.random.RandomState(19680801)
random_x = random_state.randn(10000)
plt.hist(random_x, bins=25, histtype='barstacked')
plt.show()

核心区别对比
特征 | 灰度直方图 | 正态分布图 |
---|---|---|
数据来源 | 图像像素灰度值的统计 | 符合正态分布的随机变量模拟 |
形状决定因素 | 图像内容(亮度分布) | 数学公式(μ和σ) |
对称性 | 可能不对称(取决于图像) | 严格对称 |
应用场景 | 图像质量分析、增强、分割等 | 概率统计、误差分析、自然现象建模 |
六、顾客类型的消费记录
数据

python
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as ms
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='某餐厅顾客消费记录', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('某餐厅顾客消费记录.xlsx')
df1 = df[df['顾客类型'] == '普通顾客']
df2 = df[df['顾客类型'] == '会员']
x = []
x.append(df1['消费金额(元)'])
x.append(df2['消费金额(元)'])
plt.title('某餐厅不同顾客消费记录直方图', fontsize=20, fontfamily='SimHei')
plt.xlabel('消费金额(元)', fontsize=16)
plt.ylabel('消费次数', fontsize=16)
# stacked: 允许堆积,histtype:直方图类型
plt.hist(x, bins=25, histtype='barstacked', stacked=True)
plt.legend(['普通顾客','会员',],shadow=True, fancybox=True)
plt.show()

七、不同分店的消费记录
python
# 记录频率
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as ms
# 设置主题风格
# classic、fast、petroff10、seaborn-v0_8-colorblind
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='某餐厅各分店消费记录', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('某餐厅顾客消费记录.xlsx')
df1 = df[df['分店'] == '第一分店']
df2 = df[df['分店'] == '第二分店']
df3 = df[df['分店'] == '第三分店']
x = []
x.append(df1['消费金额(元)'])
x.append(df2['消费金额(元)'])
x.append(df3['消费金额(元)'])
plt.title('某餐厅不同分店消费记录直方图', fontsize=20, fontfamily='SimHei')
plt.xlabel('消费金额(元)', fontsize=16)
plt.ylabel('消费次数', fontsize=16)
# stacked: 允许堆积,histtype:直方图类型
plt.hist(x, bins=25, histtype='barstacked', stacked=True)
plt.legend(['第一分店','第二分店','第三分店',],shadow=True, fancybox=True)
plt.show()
