数据可视化 —— 直方图

一、前言

直方图(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()
相关推荐
luckys.one3 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
大翻哥哥5 小时前
Python 2025:量化金融与智能交易的新纪元
开发语言·python·金融
zhousenshan6 小时前
Python爬虫常用框架
开发语言·爬虫·python
IMER SIMPLE6 小时前
人工智能-python-深度学习-经典神经网络AlexNet
人工智能·python·深度学习
CodeCraft Studio7 小时前
国产化Word处理组件Spire.DOC教程:使用 Python 将 Markdown 转换为 HTML 的详细教程
python·html·word·markdown·国产化·spire.doc·文档格式转换
专注API从业者7 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
java1234_小锋7 小时前
[免费]基于Python的协同过滤电影推荐系统(Django+Vue+sqlite+爬虫)【论文+源码+SQL脚本】
python·django·电影推荐系统·协同过滤
看海天一色听风起雨落8 小时前
Python学习之装饰器
开发语言·python·学习
XiaoMu_0019 小时前
基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现
python·信息可视化·旅游
THMAIL9 小时前
深度学习从入门到精通 - 生成对抗网络(GAN)实战:创造逼真图像的魔法艺术
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·cnn