数据可视化 —— 直方图

一、前言

直方图(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()
相关推荐
troy1282 小时前
Python 基础语法(九):Django/Flask/FastAPI 三大 Web 框架详细对比解析
python·jupyter·django·flask·github·fastapi
jzshmyt2 小时前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)
人工智能·pytorch·python·numpy·matplotlib·空间计算·scipy
用户8356290780514 小时前
使用 Python 将 DOCX 转换为 Markdown
后端·python
小玮看世界4 小时前
[Python]ADAS工程实战(三):多传感器扇区统计疑难点全解——归一化、跨边界、去重与置信度
python
paopaokaka_luck4 小时前
小学非遗科普平台(AI 非遗科普问答,ECharts学情数据、非遗资源分类与审核,资源收藏下载与学习记录,学习任务发布和作品评分,活动报名签到与统计)
java·人工智能·spring·信息可视化·数据分析·echarts
TomEval5 小时前
【测AI】第02篇:Python 环境搭建与基础语法速通
人工智能·python·功能测试·aigc
归去来 兮5 小时前
LangChain从入门到精通
python·langchain·langgraph
淘气的小猴子5 小时前
Python 魔术方法入门
python
我要见SA姐15 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
ide·vscode·python·自动化·编辑器
沉下心来学鲁班6 小时前
初识DeepAgents搭建第一个智能体
人工智能·python·langchain