Matplotlib 直方图(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据分析和科学计算中,直方图是一种核心工具,它能直观展示数据的分布特征。Matplotlib,作为 Python 生态中最流行的绘图库,提供了强大且灵活的直方图绘制功能。无论你是编程初学者还是有一定经验的开发者,掌握 Matplotlib 直方图的使用方法,都能显著提升你对数据的洞察力。本文将从零开始,逐步讲解直方图的原理、代码实现、参数调整以及实际应用场景,帮助你快速上手并灵活运用这一工具。


直方图的基本概念与作用

1. 直方图的定义与核心思想

直方图(Histogram)是通过将连续数据分成多个区间(称为“bins”),并统计每个区间内数据点的个数(或密度),最终以柱状图形式呈现的统计图表。其核心作用是揭示数据的分布模式,例如:

  • 数据是否符合正态分布?
  • 是否存在异常值或极端值?
  • 不同数据集的分布是否相似?

比喻:想象你统计班级学生的身高,将身高范围划分为 150cm-160cm、160cm-170cm 等区间,每个区间的“人数”即为直方图的柱高。

2. 直方图与柱状图的区别

虽然两者都用柱形表示数据,但关键区别在于:
| 特征 | 直方图 | 柱状图 |
|--------------|--------------------------------|--------------------------------|
| 数据类型 | 连续数据(如身高、时间) | 离散数据(如分类标签) |
| X轴含义 | 数据区间(bins) | 类别标签 |
| 柱子宽度 | 宽度可调整,通常等宽 | 宽度固定,无实际意义 |


Matplotlib 直方图的基础用法

1. 第一个直方图:快速入门

首先,确保已安装 Matplotlib:

pip install matplotlib  

示例代码:生成简单直方图

import matplotlib.pyplot as plt  
import numpy as np  

data = np.random.randn(1000)  

plt.hist(data, bins=20, edgecolor='black')  
plt.title("Basic Histogram of Random Data")  
plt.xlabel("Value")  
plt.ylabel("Frequency")  
plt.show()  

输出结果说明:

  • bins=20:将数据划分为20个区间。
  • edgecolor='black':为柱子添加黑色边框,便于区分。
  • 图表显示数据集中在均值附近,符合正态分布的预期。

参数详解:控制直方图的形状与样式

1. bins:定义区间划分方式

bins 是直方图最重要的参数之一,其值可为整数或自定义列表。

示例1:调整 bins 数量

plt.figure(figsize=(12, 4))  

plt.subplot(1, 2, 1)  
plt.hist(data, bins=5, edgecolor='black')  
plt.title("Fewer Bins (5)")  

plt.subplot(1, 2, 2)  
plt.hist(data, bins=50, edgecolor='black')  
plt.title("More Bins (50)")  

plt.tight_layout()  
plt.show()  

观察

  • 较少的 bins(左图)会导致数据分布的细节被模糊;
  • 较多的 bins(右图)可能增加噪声,但能捕捉更细微的波动。

示例2:自定义 bins 范围

custom_bins = [-3, -2, -1, 0, 1, 2, 3]  
plt.hist(data, bins=custom_bins, edgecolor='black')  
plt.title("Custom Bins")  
plt.show()  

2. range:限制数据的显示范围

默认情况下,Matplotlib 会根据数据自动选择显示范围,但可通过 range=(min, max) 强制限定。

plt.hist(data, bins=20, range=(-2, 2), edgecolor='black')  
plt.title("Limited Range (-2 to 2)")  
plt.show()  

3. density:标准化为概率密度

设置 density=True 可将直方图的 Y 轴转换为概率密度,使得总面积为1。

plt.hist(data, bins=20, density=True, edgecolor='black')  
plt.title("Probability Density Histogram")  
plt.ylabel("Density")  
plt.show()  

进阶技巧:增强直方图的可视化效果

1. 添加颜色与透明度

通过 coloralpha 参数,可改善图表的视觉效果。

plt.hist(data, bins=20, color='blue', alpha=0.5, edgecolor='black')  
plt.title("Colored and Transparent Histogram")  
plt.show()  

2. 叠加多组数据

比较两组数据的分布时,可通过叠加直方图实现:

data1 = np.random.randn(1000)  
data2 = np.random.normal(loc=1, scale=0.5, size=1000)  

plt.hist(data1, bins=20, alpha=0.5, label='Group 1')  
plt.hist(data2, bins=20, alpha=0.5, label='Group 2')  
plt.legend()  
plt.title("Comparing Two Distributions")  
plt.show()  

3. 使用 cumulative 参数:绘制累积分布

设置 cumulative=True 可将直方图转换为累积分布图(CDF)。

plt.hist(data, bins=20, cumulative=True, density=True,  
         histtype='step', label='CDF')  
plt.title("Cumulative Distribution Function")  
plt.xlabel("Value")  
plt.ylabel("Cumulative Probability")  
plt.legend()  
plt.show()  

实际案例:销售数据的直方图分析

1. 案例背景

假设我们有一份某电商平台的月销售额数据(单位:万元),需要分析销售分布特征。

sales = np.array([  
    15, 22, 30, 18, 25, 40, 28, 35, 12, 20,  
    19, 24, 32, 27, 38, 45, 21, 17, 31, 29  
])  

2. 绘制销售分布直方图

plt.figure(figsize=(8, 5))  
plt.hist(sales, bins=range(10, 51, 5), edgecolor='white')  
plt.title("Monthly Sales Distribution")  
plt.xlabel("Sales (in 10,000)")  
plt.ylabel("Number of Months")  

plt.grid(axis='y', linestyle='--', alpha=0.7)  
plt.show()  

分析结果:

  • 多数月份销售额集中在 15-35 万元区间;
  • 40 万元以上区间仅有少量数据点,可能为促销活动的特殊月份。

常见问题与解决方案

1. 直方图柱子重叠问题

当数据点较少或 bins 设置不当,可能导致柱子重叠。解决方案:

  • 减少 bins 数量;
  • 调整 range 参数;
  • 使用 histtype='step' 生成轮廓线直方图。
plt.hist(data, bins=10, histtype='step', linewidth=2)  
plt.show()  

2. 如何保存图表为图片?

plt.savefig("histogram.png", dpi=300, bbox_inches='tight')  

结论

Matplotlib 直方图是数据探索与分析的核心工具,其灵活性和可定制性使其适用于从基础统计到复杂数据对比的多种场景。通过本文的讲解,读者应能掌握以下能力:

  1. 快速生成基础直方图并解读分布特征;
  2. 通过 binsdensity 等参数精细控制图表形态;
  3. 结合多组数据对比或累积分布图挖掘深层信息。

未来,你可以进一步探索 Matplotlib 的其他图表类型(如箱线图、散点图),或尝试更高级的可视化库(如 Seaborn)。记住,直方图不仅是数据的“外貌”,更是理解数据内在规律的桥梁。


通过本文的学习,希望你能将 Matplotlib 直方图的技能应用于实际项目中,让数据可视化成为你解决问题的有力武器!

最新发布