数据可视化 —— 直方图

一、前言

直方图(Histogram)是一种用柱状图形表示数据分布的统计图表,它将数据划分为连续的区间(称为"分箱"或"区间"),统计每个区间内的数据频数(或频率),并用柱形的高度直观展示数据分布情况。

二、常用场景

  1. 数据分布分析

    • 观察数据集中趋势(如集中在哪个区间)、离散程度(如是否对称、是否存在长尾)或异常值。

    • 例:分析某班级学生考试成绩的分布,判断是否接近正态分布。

  2. 图像处理

    • 分析图像像素的亮度或颜色分布,辅助调整对比度、曝光或均衡化。

    • 例:Photoshop 中的直方图可帮助摄影师优化照片的明暗细节。

  3. 质量控制

    • 监测生产过程中产品的规格(如零件尺寸)是否符合标准。

    • 例:统计工厂生产的螺丝长度是否集中在目标值附近。

  4. 市场研究

    • 分析用户行为数据(如购物金额、使用时长)的分布特征。

    • 例:统计电商用户的消费金额区间,识别主要消费群体。

  5. 自然科学

    • 研究实验数据的分布规律(如气温变化、生物特征测量)。

    • 例:统计某地区每日降雨量的分布,研究气候特征。

三、直方图的优势

  • 直观展示数据分布:快速识别数据是否对称、是否多峰、是否存在偏态。

  • 发现异常值:通过离群区间判断数据中的极端值。

  • 辅助决策:帮助调整数据处理策略(如是否需要数据分箱、归一化)。


示例

假设统计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()
相关推荐
爱补鱼的猫猫37 分钟前
Pytorch知识点2
人工智能·pytorch·python
deephub37 分钟前
提升模型泛化能力:PyTorch的L1、L2、ElasticNet正则化技术深度解析与代码实现
人工智能·pytorch·python·深度学习·机器学习·正则化
weixin_4224564443 分钟前
第N1周:one-hot编码案例
python
Python私教1 小时前
字节跳动开源图标库:2000+图标一键换肤的魔法
python·开源
何双新1 小时前
第2讲、Odoo深度介绍:开源ERP的领先者
python·开源
2301_805054561 小时前
Python训练营打卡Day46(2025.6.6)
开发语言·python
曹勖之2 小时前
撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度
开发语言·python·机器人·ros2
蹦蹦跳跳真可爱5892 小时前
Python----目标检测(训练YOLOV8网络)
人工智能·python·yolo·目标检测
梓仁沐白2 小时前
【Kotlin】注解&反射&扩展
开发语言·python·kotlin
Xi_Xu2 小时前
全面解析:tzst 归档格式的先进性与跨平台文件管理指南
python·pypy