如何使用 Python Matplotlib 并排绘制两个直方图?

2025 年 1 月 5 日 | 阅读 9 分钟

理解直方图

直方图是数学数据分布的图形表示。它们提供了对某个范围内数据值频率或密度的可视化摘要,这些范围通常称为“bins”。直方图广泛用于数据分析和可视化,以探索数据集的基本模式、趋势和特征。

直方图的定义和目的

直方图是一种条形图,其中每个条形表示落在特定范围(bin)内的数据值的频率或比例。x 轴通常表示数据集的值范围,分为离散的间隔,而 y 轴表示每个间隔内数据值的频率或密度。

直方图的主要目的是可视化数据分布并识别仅从原始数据中可能不明显或不可见的模式或趋势。直方图允许分析师快速评估数据集的集中趋势、变异性、偏度和形状,从而提供对其特征的宝贵见解。

直方图的关键组成部分

  • Bins(箱):Bin 是数据值范围被划分成的间隔。每个 bin 代表一个特定的值范围,落入该范围的数据点将被计数或汇总以计算频率或密度。
  • Frequencies(频率):频率表示落入每个 bin 的数据点的数量。在频率直方图(frequency histogram)中,每个条形的高度对应于相应 bin 中感兴趣数据的数量。
  • Densities(密度):密度表示相对于数据点总数或直方图曲线下的面积的数据点的比例。在密度直方图(density histogram)中,每个条形的面积代表相应 bin 中感兴趣数据的比例。

直方图在数据分析中的优势

  • 可视化表示:直方图提供数据分布的可视化摘要,使解释和理解复杂数据集变得更加容易。
  • 模式识别:直方图有助于识别数据中的模式、趋势和异常值,使分析师能够做出明智的决策。
  • 比较:直方图便于比较不同数据集或数据子集,使分析师能够评估相似性和差异性。
  • 定量分析:直方图支持对数据分布进行定量分析,包括集中趋势、分散度和形状的度量。

直方图在数据分析中的局限性

  • Bin 选择偏差:Bin 大小和 Bin 边界的选择会影响对直方图的解释,并可能引入偏差。
  • 信息丢失:直方图提供了数据分布的概括视图,可能会掩盖原始数据中存在的详细信息。
  • 对 Bin 大小的敏感性:直方图可能对 Bin 大小的选择很敏感,这可能会影响分布的可视外观和解释。

尽管存在这些局限性,直方图仍然是探索性数据分析、假设检验和决策过程中的重要工具,为分析师提供了对数据基本特征的宝贵见解。

开始使用 Matplotlib

Matplotlib 是一个强大而灵活的 Python 可视化库。无论您是绘制简单的折线图、复杂散点图,还是直方图,Matplotlib 都提供了您需要将数据栩栩如生的工具。在深入探讨直方图绘制细节之前,让我们先回顾一下 Matplotlib 的基础知识,以确保您具备入门所需的必要知识。

安装和设置

如果您尚未安装 Matplotlib,可以使用 Python 的包管理器 pip 进行安装:

安装完成后,您就可以在 Python 脚本或交互式会话中开始使用 Matplotlib 了。

Matplotlib 图的基础结构

核心上,Matplotlib 图由几个组件组成:

  • Figure(图形):这是容纳图表中所有元素的顶级容器。
  • Axes(坐标轴):这是图形中绘制数据的区域。可以在单个图形中添加多个坐标轴来创建子图。
  • Axis(轴):这些类似于数轴的项定义了图表中数据的边界。每个轴都包含刻度线和刻度标签。
  • Artist(艺术家):构成图表的视觉元素,如线条、标记、文本和形状。

pyplot 接口简介

Matplotlib 提供了两种主要的绘图接口:pyplot 接口和面向对象的接口。pyplot 接口受 MATLAB 启发,提供了一种简单直观的方法,通过一系列模仿 MATLAB 绘图命令的函数来创建图表。

以下是使用 pyplot 接口创建简单折线图的基本示例:

输出

How to Plot Two Histograms Side by Side Using Matplotlib in Python

在此示例中,我们导入 matplotlib.pyplot 模块,并使用其 plot() 函数绘制示例数据的折线图。然后,我们使用 xlabel()、ylabel() 和 title() 等其他函数为图表添加标签和标题。最后,我们调用 show() 来显示图表。

生成示例数据

在创建和可视化直方图之前,我们需要一些数据来处理。虽然您可以使用自己的数据集,但为了演示目的,生成随机数据通常很有用。在 Python 中,NumPy 库提供了方便的函数来生成具有不同分布的各种随机数据。

示例数据的重要性

示例数据是数据分析和可视化的基础。它使我们能够探索和理解数据集的特征,识别模式并做出明智的决策。在处理直方图时,拥有代表潜在总体分布的示例数据对于进行有意义的可视化至关重要。

使用 NumPy 生成随机数据

NumPy 提供了许多生成随机数据的函数,包括来自不同分布(如正态(高斯)、均匀和二项分布)的随机数。以下是几个常用函数的简要概述:

  1. random.rand():生成 [0, 1) 范围内均匀分布的随机数。
  2. random.randn():生成标准正态分布(均值=0,标准差=1)的随机数。
  3. random.randint():生成指定低(包含)到高(不包含)范围内的随机整数。
  4. random.normal():生成具有指定均值和标准差的正态(高斯)分布的随机数。
  5. random.uniform():生成指定范围内的均匀分布的随机数。

让我们生成一些用于绘制直方图的示例数据:

在此示例中,我们使用 np.random.randn(1000) 生成一个包含 1000 个从标准正态分布中抽取的随机数数组。

真实数据源

虽然生成随机数据对于学习和实验很有用,但真实数据通常能提供更有价值的见解。您可以从各种来源获取数据集,包括在线存储库、政府机构、研究机构和公共数据计划。Kaggle、UCI 机器学习存储库和 data.gov 等网站提供了各种领域和用途的广泛数据集。

处理真实数据时,在用直方图或其他类型的图表对其进行可视化之前,务必根据需要对数据进行预处理和清理。

基本直方图绘制

既然我们对直方图及其关键组成部分有了深入的了解,让我们开始使用 Python 中的 Matplotlib 创建直方图。我们将从基础开始,介绍如何创建基本直方图并自定义其外观。

创建简单的直方图

要使用 Matplotlib 创建基本直方图,我们将使用 plt.hist() 函数,该函数会自动根据输入数据计算 bin 边界和频率。这是一个简单的示例:

输出

How to Plot Two Histograms Side by Side Using Matplotlib in Python

在这个例子中

  • 我们导入 Matplotlib 的 pyplot 模块(别名为 plt)和 NumPy(别名为 np)。
  • 我们使用 NumPy 的 np.random.randn() 函数创建 1000 个从标准正态分布中抽取的随机数。
  • 我们使用 plt.hist() 创建数据的直方图,指定 bin 的数量(bins=30)、颜色(color='blue')和透明度(alpha=0.5)。
  • 我们分别使用 plt.xlabel() 和 plt.ylabel() 函数为 x 轴和 y 轴添加标签。
  • 我们使用 plt.title() 设置图表的标题。
  • 最后,我们使用 plt.show() 显示图表。

自定义直方图外观

Matplotlib 提供了多种选项来根据您的喜好自定义直方图的外观。您可以修改颜色、透明度、bin 边界等属性。以下是一些常见的自定义选项:

颜色:您可以使用 color 参数指定直方图条形的颜色。

透明度:您可以使用 alpha 参数更改条形的透明度,该参数的值介于 0(完全透明)和 1(完全不透明)之间。

Bin 边界:您可以使用 bins 参数指定自定义 bin 边界,该参数接受一个定义 bin 边界的数组。

直方图类型:Matplotlib 支持各种直方图类型,包括 'bar'、'barstacked'、'step'、'stepfilled' 等。

示例

输出

How to Plot Two Histograms Side by Side Using Matplotlib in Python

高级直方图绘制技术

在本节中,我们将探讨使用 Python 中的 Matplotlib 进行高级直方图绘制技术。我们将涵盖绘制多个直方图、调整 bin 尺寸以及叠加概率密度函数(PDF)以增强可视化效果等主题。

绘制多个直方图

通常,我们可能需要在同一个图表中比较不同数据集的分布。Matplotlib 允许我们在相同的坐标轴上绘制多个直方图,从而轻松可视化和比较不同的数据集。这是一个示例:

输出

How to Plot Two Histograms Side by Side Using Matplotlib in Python

在此示例中

我们使用 NumPy 的 np.random.randn() 函数创建两组示例数据(data1 和 data2)。

我们使用 plt.hist() 为这两个数据集绘制直方图,为每个直方图指定不同的颜色和透明度级别。

我们添加 x 轴和 y 轴标签,设置图表标题,并添加图例以区分这两个数据集。

最后,我们使用 plt.show() 显示图表。

调整 Bin 尺寸

Bin 尺寸的选择会显着影响直方图的外观和解释。Matplotlib 允许我们指定自定义 Bin 尺寸或让其根据数据自动确定 Bin 边界。这是一个调整 Bin 尺寸的示例:

输出

How to Plot Two Histograms Side by Side Using Matplotlib in Python

在此示例中,我们创建了两个具有不同 Bin 尺寸(bins=20 和 bins=50)的直方图,以可视化 Bin 尺寸对直方图外观的影响。

结论

总之,掌握使用 Python Matplotlib 绘制直方图对于有效的数据可视化和分析至关重要。直方图提供了对数据分布的宝贵见解,有助于识别模式和分析趋势。Matplotlib 提供了一个灵活的平台来创建和自定义直方图,从基本图表到绘制多个直方图和叠加概率密度函数等高级技术。通过实践和探索,您可以利用直方图有效地传达见解,并在数据分析工作中推动明智的决策。