使用 matplotlib、Seaborn 和 Bokeh 在 Python 中进行数据可视化

数据可视化是所有人工智能和机器学习应用的重要组成部分。通过不同的图形表示,您可以获得对数据的关键洞察。在本教程中,我们将讨论在 Python 中进行数据可视化的几种选择。我们将使用 MNIST 数据集和 Tensorflow 库进行数值计算和数据处理。为了说明创建不同类型图表的各种方法,我们将使用 Python 的绘图库,即 Matplotlib、Seaborn 和 Bokeh。

完成本教程后,您将了解:

  • 如何在 Matplotlib 中可视化图像
  • 如何在 Matplotlib、Seaborn 和 Bokeh 中制作散点图
  • 如何在 Matplotlib、Seaborn 和 Bokeh 中制作多线图

通过我的新书《Python 机器学习开启您的项目,其中包括逐步教程和所有示例的 Python 源代码文件。

让我们开始吧。

Picture of Istanbul taken from airplane

使用 Matplotlib、Seaborn 和 Bokeh 在 Python 中进行数据可视化
图片由 Mehreen Saeed 拍摄,保留部分权利。

教程概述

本教程分为七个部分,它们是:

  • 散点数据准备
  • Matplotlib 中的图形
  • Matplotlib 和 Seaborn 中的散点图
  • Bokeh 中的散点图
  • 折线图数据准备
  • Matplotlib、Seaborn 和 Bokeh 中的折线图
  • 更多可视化内容

散点数据准备

在本文中,我们将使用 Matplotlib、Seaborn 和 Bokeh。它们都是需要安装的外部库。要使用 pip 安装它们,请运行以下命令

为了演示目的,我们还将使用 MNIST 手写数字数据集。我们将从 TensorFlow 加载它并对其运行 PCA 算法。因此,我们还需要安装 TensorFlow 和 pandas

之后的代码将假定已执行以下导入

我们从 keras.datasets 库加载 MNIST 数据集。为简单起见,我们将只保留包含前三位数字的数据子集。我们暂时也将忽略测试集。

想开始学习机器学习 Python 吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

Matplotlib 中的图形

Seaborn 确实是 Matplotlib 的一个附加组件。因此,即使使用 Seaborn,您也需要了解 Matplotlib 如何处理绘图。

Matplotlib 将其画布称为 figure。您可以将 figure 分为几个称为 subplots 的部分,这样您就可以将两个可视化并排放置。

例如,让我们使用 Matplotlib 可视化 MNIST 数据集的前 16 张图像。我们将使用 subplots() 函数创建 2 行 8 列。subplots() 函数将为每个单元创建坐标轴对象。然后我们将使用 imshow() 方法在每个坐标轴对象上显示每张图像。最后,将使用 show() 函数显示 figure。

First 16 images of the training dataset displayed in 2 rows and 8 columns

训练数据集的前 16 张图像以 2 行 8 列显示

这里我们可以看到 Matplotlib 的一些属性。Matplotlib 中有默认的 figure 和默认的 axes。Matplotlib 在 pyplot 子模块下定义了许多函数用于在默认 axes 上绘图。如果要在特定 axes 上绘图,可以使用 axes 对象下的绘图函数。操作 figure 的过程是程序性的。这意味着 Matplotlib 内部会记住一个数据结构,我们的操作会改变它。show() 函数只是显示一系列操作的结果。因此,我们可以逐步微调 figure 中的许多细节。在上面的示例中,我们通过将 xticksyticks 设置为空列表来隐藏“刻度”(即坐标轴上的标记)。

Matplotlib 和 Seaborn 中的散点图

我们在机器学习项目中常用的可视化之一是散点图。

例如,我们将 PCA 应用于 MNIST 数据集并提取每个图像的前三个主成分。在下面的代码中,我们从数据集中计算特征向量和特征值,然后将每个图像的数据沿特征向量方向投影并将结果存储在 x_pca 中。为简单起见,在计算特征向量之前,我们没有将数据归一化为零均值和单位方差。这种省略不影响我们的可视化目的。

打印的特征值如下

数组 x_pca 的形状为 18623 x 784。让我们将最后两列视为 x 和 y 坐标,并在图中绘制每行的点。我们可以根据其对应的数字进一步为点着色。

以下代码使用 Matplotlib 生成散点图。该图是使用 axes 对象的 scatter() 函数创建的,该函数将 x 和 y 坐标作为前两个参数。scatter() 方法的 c 参数指定一个将成为其颜色的值。s 参数指定其大小。该代码还创建了一个图例并为图添加了一个标题。

2D scatter plot generated using Matplotlib

使用 Matplotlib 生成的 2D 散点图

将以上代码整合起来,下面是使用 Matplotlib 生成 2D 散点图的完整代码

Matplotlib 也允许生成 3D 散点图。为此,您需要首先创建一个具有 3D 投影的 axes 对象。然后使用 scatter3D() 函数创建 3D 散点图,其中 x、y 和 z 坐标作为前三个参数。下面的代码使用沿对应于三个最大特征值的特征向量投影的数据。此代码不是创建图例,而是创建颜色条

3D scatter plot generated using Matplotlib

使用 Matplotlib 生成的 3D 散点图

scatter3D() 函数只是将点放置到 3D 空间中。之后,我们仍然可以修改图的显示方式,例如每个轴的标签和背景颜色。但在 3D 图中,一个常见的调整是视口,即我们观察 3D 空间的角度。视口由 axes 对象中的 view_init() 函数控制

视口由仰角(即与水平面的夹角)和方位角(即在水平面上的旋转)控制。默认情况下,Matplotlib 使用 30 度仰角和 -60 度方位角,如上所示。

将所有内容整合起来,下面是使用 Matplotlib 创建 3D 散点图的完整代码

在 Seaborn 中创建散点图同样简单。scatterplot() 方法在绘制点时会自动创建图例并为不同的类别使用不同的符号。默认情况下,该图是在 Matplotlib 的“当前轴”上创建的,除非由 ax 参数指定了轴对象。

2D scatter plot generated using Seaborn

使用 Seaborn 生成的 2D 散点图

Seaborn 相对于 Matplotlib 的好处有两方面:首先,我们有一个精美的默认样式。例如,如果我们比较上面两个散点图中的点样式,Seaborn 的点周围有一个边框,以防止许多点混在一起。实际上,如果我们在调用任何 Matplotlib 函数之前运行以下行

我们仍然可以使用 Matplotlib 函数,但通过使用 Seaborn 的样式可以获得更好看的图形。其次,如果我们使用 pandas DataFrame 来保存数据,使用 Seaborn 会更方便。例如,让我们将 MNIST 数据从张量转换为 pandas DataFrame

现在,DataFrame 看起来像这样

然后,我们可以使用以下代码重现 Seaborn 的散点图

我们不将数组作为坐标传递给 scatterplot() 函数,而是使用 data 参数的列名。

以下是使用 Seaborn 生成散点图的完整代码,数据存储在 pandas 中

Seaborn 作为某些 Matplotlib 函数的包装器,并没有完全取代 Matplotlib。例如,Seaborn 不支持 3D 绘图,我们仍然需要借助 Matplotlib 函数来实现此目的。

Bokeh 中的散点图

Matplotlib 和 Seaborn 创建的图是静态图像。如果您需要放大、平移或切换图的某些部分的显示,您应该改用 Bokeh。

在 Bokeh 中创建散点图也很容易。以下代码生成一个散点图并添加一个图例。Bokeh 库的 show() 方法会打开一个新浏览器窗口来显示图像。您可以使用渲染图旁边的工具栏中显示的选项进行缩放、平移、滚动等操作。您还可以通过单击图例来隐藏散点图的一部分。

Bokeh 将使用 Javascript 生成 HTML 中的图。您控制图的所有操作都由一些 Javascript 函数处理。其输出将如下所示

2D scatter plot generated using Bokeh in a new browser window. Note the various options on the right for interacting with the plot.

使用 Bokeh 在新浏览器窗口中生成的 2D 散点图。请注意右侧工具栏中用于与图交互的各种选项。

以下是使用 Bokeh 生成上述散点图的完整代码

如果您在 Jupyter 笔记本中渲染 Bokeh 图,您可能会看到该图是在新浏览器窗口中生成的。要将该图放入 Jupyter 笔记本中,您需要在 Bokeh 函数之前运行以下代码,以告知 Bokeh 您处于笔记本环境中

另外,请注意,我们是循环创建三个数字的散点图,一次一个数字。这是使图例具有交互性所必需的,因为每次调用 scatter() 都会创建一个新对象。如果我们将所有散点同时创建,如下所示,单击图例将隐藏和显示所有内容,而不是只隐藏和显示其中一个数字的点。

折线图数据准备

在继续展示如何可视化折线图数据之前,让我们生成一些数据进行说明。下面是使用 Keras 库的简单分类器,我们训练它来学习手写数字分类。fit() 方法返回的 history 对象是一个字典,其中包含训练阶段的所有学习历史。为简单起见,我们将模型只训练 10 个 epoch。

上面的代码将生成一个字典,其中包含键 lossaccuracyval_lossval_accuracy,如下所示

Matplotlib、Seaborn 和 Bokeh 中的折线图

让我们看看可视化从训练分类器获得的学习历史的各种选项。

在 Matplotlib 中创建多线图就像下面这样简单。我们从历史中获取训练和验证准确率的值列表,默认情况下,Matplotlib 会将其视为顺序数据(即 x 坐标是从 0 开始计数的整数)。

Multi-line plot using Matplotlib

使用 Matplotlib 绘制的多线图

创建多线图的完整代码如下

类似地,我们可以在 Seaborn 中做同样的事情。正如我们在散点图示例中看到的,我们可以将数据显式地作为一系列值传递给 Seaborn,或者通过 pandas DataFrame 传递。下面我们将使用 pandas DataFrame 绘制训练损失和验证损失。

它将打印以下表格,这是我们从历史中创建的 DataFrame

它生成的图如下所示

Multi-line plot using Seaborn

使用 Seaborn 绘制的多线图

默认情况下,Seaborn 将从 DataFrame 中理解列标签并将其用作图例。在上面,我们为每个绘图提供了新的标签。此外,折线图的 x 轴默认取自 DataFrame 的索引,在我们的例子中是一个从 0 到 9 的整数,如上所示。

在 Seaborn 中生成图的完整代码如下

正如您所料,如果我们需要精确控制 x 坐标和 y 坐标,我们也可以像上面的 Seaborn 散点图示例中那样,在调用 lineplot() 时同时提供 xy 参数以及 data 参数。

Bokeh 也可以生成多线图,如下面的代码所示。正如我们在散点图示例中看到的,我们需要明确提供 x 和 y 坐标,并一次绘制一条线。同样,show() 方法会打开一个新浏览器窗口来显示图,您可以与它进行交互。

Multi-line plot using Bokeh. Note the options for user interaction shown on the toolbar on the right.

使用 Bokeh 绘制的多线图。请注意右侧工具栏上显示的用户交互选项。

制作 Bokeh 图的完整代码如下

更多可视化内容

我们上面介绍的每个工具都有更多的功能,可以让我们控制可视化的细节。搜索它们各自的文档以了解如何完善您的图表非常重要。同样重要的是查看其文档中的示例代码,以了解如何使您的可视化效果更好。

无需提供太多细节,这里有一些您可能希望添加到可视化中的想法

  • 添加辅助线,例如在时间序列数据上标记训练和验证数据集。Matplotlib 的 axvline() 函数可以为此目的在图表上绘制垂直线。
  • 添加注释,例如箭头和文本标签,以识别图上的关键点。请参阅 Matplotlib 坐标轴对象中的 annotate() 函数。
  • 在图形元素重叠的情况下控制透明度级别。我们上面介绍的所有绘图函数都允许使用 alpha 参数,提供一个介于 0 和 1 之间的值来表示我们可以透过图形看到多少。
  • 如果数据通过这种方式更好地说明,我们可能会以对数刻度显示一些轴。它通常被称为对数图或半对数图。

在结束本文之前,以下是一个在 Matplotlib 中创建并排可视化的示例,其中一个使用 Seaborn 创建

使用 Matplotlib 和 Seaborn 创建的并排可视化

Bokeh 中的等效操作是分别创建每个子图,然后在显示时指定布局

在 Bokeh 中创建的并排图

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

书籍

文章

API 参考

总结

在本教程中,您了解了在 Python 中进行数据可视化的各种选项。

具体来说,你学到了:

  • 如何创建不同行和列的子图
  • 如何使用 Matplotlib 渲染图像
  • 如何使用matplotlib生成2D和3D散点图
  • 如何使用Seaborn和Bokeh创建2D图表
  • 如何使用matplotlib、Seaborn和Bokeh创建多行图表

您对本文讨论的数据可视化选项有任何疑问吗?请在下面的评论中提出您的问题,我将尽力回答。

掌握机器学习 Python!

Python For Machine Learning

更自信地用 Python 编写代码

...从学习实用的 Python 技巧开始

在我的新电子书中探索如何实现
用于机器学习的 Python

它提供自学教程数百个可运行的代码,为您提供包括以下技能:
调试性能分析鸭子类型装饰器部署等等...

向您展示高级 Python 工具箱,用于
您的项目


查看内容

, , , , , , , ,

使用matplotlib、Seaborn和Bokeh在Python中进行数据可视化的6条回复

  1. Dipankar Porey 2022年3月22日上午5:25 #

    致Jason Brownlee和团队,

    我阅读了你们YouTube频道上所有关于GAN的博客,非常有趣且解释得很完整。只想说,你们能否在生成模型演进方面进行一些扩展,简单来说就是,“如何找到生成模型的收敛性?”目前我正在做一个CGAN项目。我也在尝试这个扩展。所以如果您有任何建议,请告诉我。

    谢谢你。

  2. Richard 2022年3月25日上午3:47 #

    我认为第一行代码有拼写错误,‘boken’而不是‘bokeh’。

    • James Carmichael 2022年3月25日下午1:47 #

      感谢您的反馈,Richard!

  3. shaheen 2022年3月25日下午4:22 #

    愿上帝保佑您,
    如何在我们的论文中引用您的博客

  4. Perri 2023年2月21日上午11:27 #

    我觉得“可视化”这个标题有点误导。您只是简单地绘制了准确度曲线并显示了原始数据。对我来说,机器学习可视化通常是实际机器学习的视觉表现。聚类图、热图、PDFs…

    这里有一些不错的知识,但我真的不认为这是可视化

    • James Carmichael 2023年2月22日上午8:25 #

      感谢您的反馈,Perri!

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。