Matplotlib-实用指南-一-

111 阅读53分钟

Matplotlib 实用指南(一)

原文:Hands-on Matplotlib

协议:CC BY-NC-SA 4.0

一、Python 3 简介

欢迎大家来到 Matplotlib 和相关库(如 NumPy、Pandas 和 Seaborn)的激动人心的数据可视化之旅。

本章涵盖了 Python 编程语言的基础知识,包括它的历史、安装和应用。您将编写一些简单的介绍性 Python 3 程序,并学习如何在各种操作系统平台上执行它们。

然后,我们将开始探索科学的 Python 生态系统。我们将简要讨论科学 Python 生态系统的成员库,最后,我们将探索 Jupyter Notebook,以便我们可以在本书的其余部分使用它。

具体来说,本章包含以下主题:

  • Python 编程语言

  • 各种平台上的 Python 安装

  • Python 模式

  • Python IDEs

  • 科学 Python 生态系统

  • Jupyter 笔记本概述和设置

  • Jupyter 笔记本中的运行代码

  • 蟒蛇

阅读完这一章后,您将会对 Python 3 编程语言在各种平台上的各种模式下的安装和基本用法驾轻就熟。

Python 3 编程语言简介

Python 3 是一种通用的高级解释编程语言。在这一节中,我们将讨论 Python 编程语言及其哲学。

Python 编程语言的历史

Python 是 ABC 编程语言的继承者,ABC 编程语言本身受到 ALGOL 68 和 SETL 编程语言的启发。Python 是吉多·范·罗苏姆在 20 世纪 80 年代末度假期间作为业余项目创作的,当时他在荷兰的 Centrum Wiskunde & Informatica(英文:“国家数学和计算机科学研究所”)工作。范·罗森在荷兰出生并长大。他获得了阿姆斯特丹大学的数学和计算机科学硕士学位。他曾为谷歌和 Dropbox 工作,之后退休。然而,2020 年 11 月,他加入了微软。

自 Python 编程语言最初发布至 2018 年 7 月,Guido 一直是这个项目的首席开发者和终身慈善独裁者(BDFL)。他在 2019 年一直在 Python 的指导委员会工作,但在 2020 年,他撤回了对指导委员会连任的提名。

以下是 Python 发布时间表中的重要里程碑:

  • 【1991 年 2 月 : Van Rossum 向alt.sources发布了代码(标签为 0.9.0 版)。

  • 【1994 年 1 月:1.0 版本发布。

  • 【2000 年 10 月 : Python 2.0 发布。

  • 【2006 年 12 月 : Python 3.0 发布。

  • 【2019 年 12 月 : Python 2。 x 正式退役,不再受 Python 软件基金会支持。

如你所见,Python 2。随着 Python 2 的退役,不再支持 x 版本。Python 3 不向后兼容 Python 2。Python 3 是 Python 编程语言的最新版本,也是受支持的版本。因此,我们将在整本书中使用 Python 3 编程来演示所涵盖的概念。除非明确提到,否则在本书中,Python 指的是 Python 3。

Python 增强提案

为了指导 Python 的开发、维护和支持,Python 领导层提出了 Python 增强提案 (PEPs)的概念。它们是 Python 项目中建议新特性和修复问题的主要机制。您可以通过以下网址了解有关 pep 的更多信息:

https://www.python.org/dev/peps/
https://www.python.org/dev/peps/pep-0001/

Python 编程语言的哲学

Python 的哲学在 PEP20 中有详细介绍。被称为蟒之禅,在 https://www.python.org/dev/peps/pep-0020/ 。以下是人教版的要点。有几个很搞笑。

  • 漂亮总比难看好。

  • 显性比隐性好。

  • 简单比复杂好。

  • 复杂总比复杂好。

  • 扁平的比嵌套的好。

  • 疏比密好。

  • 可读性很重要。

  • 特例不足以特殊到打破规则。

    • 虽然实用性战胜了纯粹性。
  • 错误永远不会无声无息地过去。

    • 除非明确沉默。
  • 面对暧昧,拒绝猜测的诱惑。

  • 应该有一种——最好只有一种——显而易见的方法来做这件事。

    • 尽管这种方式一开始可能并不明显,除非你是荷兰人。
  • 现在总比没有好。

    • 虽然永远也不会比现在的好。
  • 如果实现很难解释,这是一个坏主意。

  • 如果实现很容易解释,这可能是一个好主意。

  • 名称空间是一个非常棒的想法——让我们多做一些吧!

这些是继续影响 Python 编程语言发展的基本原则。

Python 的应用

如你所知,Python 是一种通用编程语言;它在以下领域有许多应用:

  • Web 开发

  • GUI 开发

  • 科学和数值计算

  • 软件开发

  • 系统管理员

你可以在 https://www.python.org/success-stories/ 阅读 Python 的案例分析。

在各种平台上安装 Python

Python 实现是一个程序(Python 解释器的实际二进制可执行文件),它支持用 Python 编程语言编写的程序的执行。Guido van Russom 创建的最初实现被称为 CPython ,并作为参考实现。在整本书中,我们将使用 CPython。它可以在 Python 网站上获得,在这一节中,您将学习如何在 Windows 操作系统上安装它。我更喜欢在 Windows 电脑或装有 Raspberry Pi 操作系统的 Raspberry Pi 电脑上编写 Python 程序。您可以在 https://www.python.org/download/alternatives/ 找到备选 Python 实现的列表。

我认为现在是讨论各种 Python 发行版的好时机。你看到了 Python 的实际解释程序被称为实现。当它与一些有用的东西捆绑在一起时,比如集成开发环境(IDE)、工具和库,它被称为发行版。你可以在 https://wiki.python.org/moin/PythonDistributions 找到 Python 发行版列表。

现在,让我们看看如何在这两个平台上安装 Python。

在 Windows 电脑上安装

访问位于 https://www.python.org/downloads/ 的 Python 3 下载页面,为您的计算机下载 Python 3 的安装文件。页面会自动检测您电脑上的操作系统,并显示合适的可下载文件,如图 1-1 所示。

img/515442_1_En_1_Fig1_HTML.jpg

图 1-1

带有下载选项的 Python 项目主页

运行安装文件来安装 Python 3。在安装过程中,选中与将 Python 3 添加到 PATH 变量相关的复选框(图 1-2 )。

img/515442_1_En_1_Fig2_HTML.jpg

图 1-2

Python 安装向导

此外,选择“自定义安装”选项。这将带您进入更多选项,如图 1-3 所示。

img/515442_1_En_1_Fig3_HTML.jpg

图 1-3

Python 安装选项

选择所有复选框,然后单击“下一步”按钮继续设置。完成设置。Python 的二进制可执行程序在 Windows 上的名字是python。安装完成后,在 Windows 命令提示符下运行以下命令,cmd:

python -V

这会返回 Python 3 的版本,如下所示:

Python 3.8.1

您也可以按如下方式检查 pip 的版本:

pip3 -V

一个递归缩写, pip 代表“pip 安装 Python”或“Pip 安装软件包”。它是 Python 编程语言的一个包管理器。您可以使用 pip 实用程序为我们的演示安装其他所需的 Python 库。

要找出 Python 的确切位置,可以运行如下的where命令:

where python

这将返回以下结果:

C:\Users\Ashwin\AppData\Local\Programs\Python\Python38-32\python.exe

同样,您可以通过运行以下命令找到 pip3 实用程序的位置:

where pip3

我们将在整本书中大量使用这个工具,在我们使用的计算机上安装和管理 Python 3 库。以下命令列出了所有已安装的软件包:

pip3 list

在 Ubuntu/Debian 衍生产品上安装

Debian 是一个流行的发行版。Ubuntu Linux 和 Raspberry Pi OS 是基于 Debian 的其他流行发行版。Python 3 和 pip3 预装在所有 Debian 发行版和衍生版本中,如 Ubuntu 或 Raspberry Pi OS。因此,我们不必单独安装它们。我在一台 8 GB 内存的 Raspberry Pi 4B 上使用 Raspberry Pi 操作系统作为我的 Linux 计算机。Python 的两个主要版本,Python 2 和 Python 3,都预装在所有的 Debian 衍生版本中。它们的解释器可执行文件在 Python 2 和 Python 3 中分别命名为pythonpython3。我们将使用python3进行演示。要找出所需的二进制可执行文件的版本和位置,请逐一运行以下命令:

python3 -V
pip3 -V
which python3
which pip3

几乎所有其他流行的 Linux 发行版都预装了 Python。

使用 Python 模式

Python 编程语言有各种执行程序(和语句,您很快就会看到)的模式。让我们逐一讨论。但是在我们开始讨论之前,让我们看看什么是空闲。IDLE 是 Python 软件基金会为 Python 编程开发的集成开发和学习环境。在 Windows 上安装 Python 3 的 CPython 实现时,也会安装 IDLE。您可以通过多种方式在 Windows 操作系统上启动它。第一种方法是在 Windows 搜索栏中输入 IDLE 进行搜索,如图 1-4 所示。

img/515442_1_En_1_Fig4_HTML.jpg

图 1-4

Python 在 Windows 上空闲

另一种方法是通过运行以下命令从命令提示符(cmd)启动它:

idle

这将启动如图 1-5 所示的窗口。

img/515442_1_En_1_Fig5_HTML.jpg

图 1-5

Python 空闲

在继续之前,您需要自定义 IDLE,以便它为您工作。您可以通过选择选项➤配置空闲来更改字体,如图 1-6 所示。

img/515442_1_En_1_Fig6_HTML.jpg

图 1-6

配置空闲

图 1-7 所示的窗口打开,您可以在空闲时更改字符的字体和大小。

img/515442_1_En_1_Fig7_HTML.jpg

图 1-7

空闲配置窗口

根据自己的喜好调整选项。

并非所有的 Linux 发行版都预装了 IDLE。您可以通过依次运行以下命令,将它安装在 Debian 及其衍生物(Ubuntu 和 Raspberry Pi OS)上:

sudo apt-get update
sudo apt-get install idle3

一旦安装完成,你可以在菜单中找到 IDLE(这里是 Raspberry Pi OS 菜单),如图 1-8 所示。

img/515442_1_En_1_Fig8_HTML.jpg

图 1-8

在 Raspberry Pi 操作系统菜单中空闲

您也可以通过运行以下命令在 Linux 上启动 IDLE:

idle

现在我们来讨论一下 Python 的各种模式。

对话方式

Python 的交互模式就像一个命令行 shell,执行当前语句,并在控制台上给出即时反馈。它会立即运行提供给它的语句。当新的语句被输入解释器并由解释器执行时,代码被求值。当您打开 IDLE 时,您会看到一个命令行提示。这是 Python 的交互模式。为了看一个简单的例子,让我们在交互提示中键入习惯的 Hello World 程序,如下所示:

print('Hello World!')

按 Enter 键将该行输入解释器并执行它。图 1-9 显示了输出。

img/515442_1_En_1_Fig9_HTML.jpg

图 1-9

空闲时的 Python 交互模式

您也可以从命令提示符启动 Python 的交互模式。在 Linux 命令提示符下(例如 lxterminal),运行命令python3,在 Windows 命令提示符下(cmd,运行命令python。图 1-10 显示了 Windows 命令提示符下的交互模式。

img/515442_1_En_1_Fig10_HTML.jpg

图 1-10

Python 交互模式,Windows 命令提示符

脚本模式

你可以写一个 Python 程序,保存到磁盘。然后你可以用多种方式启动它。这被称为脚本模式。让我们在空闲时演示一下。您可以使用任何文本编辑器来编写 Python 程序。但是因为 IDLE 是一个 IDE,所以使用 IDLE 编写和运行 Python 程序很方便。让我们先看看那个。在空闲状态下,选择文件➤新文件。这将创建一个新的空白文件。向其中添加以下代码:

print('Hello World!')

然后用名称prog01.py保存在磁盘上(图 1-11 )。

img/515442_1_En_1_Fig11_HTML.jpg

图 1-11

空闲代码编辑器中的 Python 程序

在菜单中,选择运行➤运行模块。这将在 IDLE 的提示下执行程序,如图 1-12 所示。

img/515442_1_En_1_Fig12_HTML.jpg

图 1-12

在空闲提示符下执行的 Python 程序

你甚至可以在操作系统的命令提示符下用 Python 的解释器启动程序。打开操作系统的命令提示符,导航到存储程序的目录。在 Windows 命令提示符下,运行以下命令:

python prog01.py

在 Linux 终端中,您必须运行以下命令提示符:

python3 prog01.py

然后解释器将在命令提示符下运行程序,输出(如果有的话)将出现在那里。

在 Linux 中,有另一种方法可以运行程序,而不需要显式地使用解释器。您可以在代码文件的开头添加一个 shebang 行。例如,假设我们的代码文件如下所示:

#!/usr/bin/python3
print('Hello World!')

第一条线被称为 shebang 线。它告诉 shell 使用什么解释器及其位置。然后运行以下命令更改文件权限,使其对所有者可执行,如下所示:

chmod 755 prog01.py

然后你可以像其他可执行文件一样用./直接启动你的 Python 程序文件,如下所示:

./prog01.py

shell 将执行程序并在终端中打印输出。请注意,这仅适用于类 Unix 系统(Linux 和 macOS ),因为它们支持像这样执行程序。在整本书中,你会学到更多关于 Python 编程的知识。

使用 Python IDEs

您已经学习了如何使用 Python 解释器和 IDLE 来运行 Python 3 语句和程序。您可以使用其他免费提供的 ide 和插件,让 ide 与 Python 一起工作。下面是一些著名的 Python 3 和插件的列表,以及它们主页的 URL:

所有这些 ide 和插件都可以免费下载和使用。作为本章的一个练习,您可能想要探索它们以找到您最熟悉的 IDE。

探索科学 Python 生态系统

科学 Python 生态系统是用于科学计算的开源 Python 库的集合。它有以下核心组件:

  • Python :这是一种编程语言。

  • NumPy:这是数值计算的基础库。科学 Python 生态系统中几乎所有的库都是基于 NumPy 的。它提供了一种被称为Ndarray(N 维数组)的通用数据结构。

  • 这个库有许多科学计算的例程。

  • Matplotlib :这是一个可视化的库。它的pyplot模块有 Matlab 风格的可视化例程。

所有这些组件一起提供了类似 Matlab 的功能:

  • 这是一个数据科学的图书馆,提供了高性能、易于使用的数据结构,比如用于存储数据的系列和数据框架。

  • 这是给符号数学和代数的。

  • 这是一个表示和可视化图形和网络的库。

  • 这是一个用于图像处理的库。

  • Scikit-learn :这是一个机器学习和人工智能的库。

除了这些库,IPython 还为 Python 解释器提供了更好的交互环境。IPython 的交互环境可以通过使用 Jupyter Notebook 的基于网络的笔记本来访问。

这一章的其余部分着重于朱庇特笔记本。

Jupyter 笔记本介绍

在本章的前面,您学习了运行 Python 语句的各种方法。您在脚本中和解释器的交互模式下运行 Python 语句。使用交互模式的主要优势是即时反馈。这种模式的主要缺点是,如果您在输入的语句中出现任何错误,您必须重新编写整个语句才能重新执行。另外,很难将其保存为程序。可以在菜单的文件选项中找到保存要在解释器上运行的语句的选项。但是,所有的语句及其输出将以纯文本格式保存,扩展名为.py。如果有任何图形输出,它将单独显示,不能与语句一起存储。

由于解释器中交互模式的限制,我们将使用更好的工具在 web 浏览器中交互运行 Python 语句。这个工具被称为 Jupyter 笔记本。它是一个服务器程序,可以在网络浏览器中创建交互式笔记本。

Jupyter Notebook 是一个基于 web 的笔记本,用于各种编程语言的交互式编程,如 Python、Octave、Julia 和 r。它很受研究领域工作人员的欢迎。Jupyter Notebook 可以将代码、可视化、输出和富文本保存在一个文件中。Jupyter Notebook 相对于 Python 自带的交互提示的优势在于,你可以编辑代码,即时看到新的输出,这在 Python 的交互模式下是做不到的。另一个优点是,您将代码、富文本元素和代码输出(可以是图形或富文本格式)放在磁盘上的同一个文件中。这使得分发变得容易。您可以通过互联网或使用便携式存储设备保存和共享这些笔记本。网上有很多服务可以帮助你在云服务器上存储和执行你的笔记本脚本。

设置 Jupyter 笔记本

通过在命令提示符下运行以下命令,您可以在任何计算机上轻松安装 Jupyter 笔记本服务器程序:

pip3 install jupyter

现在让我们看看如何使用 Jupyter Notebook 来编写和执行 Python 语句。在操作系统的命令提示符下运行以下命令,启动 Jupyter 笔记本服务器进程:

jupyter notebook

Jupyter 笔记本服务器进程将被启动,命令提示符窗口显示服务器日志,如图 1-13 所示。

img/515442_1_En_1_Fig13_HTML.jpg

图 1-13

启动新的 Jupyter 笔记本流程

此外,它会在操作系统的默认浏览器中启动一个网页。如果浏览器窗口已经打开,则它会在同一浏览器窗口的新选项卡中启动页面。打开页面的另一种方法(如果您关闭运行 Jupyter Notebook 的浏览器窗口)是在浏览器中访问http://localhost:8888/。显示如图 1-14 所示的页面。

img/515442_1_En_1_Fig14_HTML.jpg

图 1-14

使用令牌登录

以下几行文本是服务器日志。

To access the notebook, open this file in a browser:

file:///C:/Users/Ashwin/AppData/Roaming/jupyter/runtime/nbserver-8420-open.html

Or copy and paste one of these URLs:

http://localhost:8888/?token=e4a4fab0d8c22cd01b6530d5daced19d32d7e0c3a56f925c
http://127.0.0.1:8888/?token=e4a4fab0d8c22cd01b6530d5daced19d32d7e0c3a56f925c

在前面的日志中,您可以看到几个 URL。它们引用同一个页面(localhost 和 127.0.0.1 是同一个主机)。您可以直接在浏览器选项卡的地址栏中复制并粘贴这些 URL,然后打开 Jupyter 笔记本主页,或者您可以访问前面讨论过的http://localhost:8888/,然后在服务器日志中粘贴令牌(在我们的示例中是e4a4fab0d8c22cd01b6530d5daced19d32d7e0c3a56f925c)并登录。这将把你带到同一个主页。

请注意,Jupyter 笔记本服务器的每个实例都有自己的令牌,因此书中显示的令牌不适用于您的笔记本。该令牌仅对该服务器进程有效。

因此,如果您遵循前面解释的任何一条路线,您将在浏览器窗口中看到一个主页选项卡,如图 1-15 所示。

img/515442_1_En_1_Fig15_HTML.jpg

图 1-15

木星笔记本的新主页标签

如您所见,网页上有三个选项卡:文件、运行和集群。“文件”选项卡显示从命令提示符启动笔记本服务器的目录中的目录和文件。在前面的例子中,我从我的 Raspberry Pi 的 lxterminal 执行了命令jupyter notebook。当前工作目录是pi用户/home/pihome目录。这就是为什么你可以在图 1-15 中看到我的树莓派电脑主目录下的所有文件和目录。

在右上角,您可以看到退出和注销按钮。如果您单击“注销”按钮,它将从当前会话中注销,要登录,您还需要笔记本服务器日志中嵌入了令牌的令牌或 URL,如前所述。如果你点击退出按钮,那么它会停止在命令提示符下运行的笔记本服务器进程,并显示如图 1-16 所示的模态消息框。

img/515442_1_En_1_Fig16_HTML.png

图 1-16

单击退出按钮后显示的消息

要使用 Jupyter 笔记本,您需要在命令提示符下再次执行命令jupyter notebook

在右上角,就在退出和注销按钮的下方,您可以看到一个带有刷新符号的小按钮。此按钮刷新主页。您还有一个新按钮。点击后会显示下拉列表,如图 1-17 所示。

img/515442_1_En_1_Fig17_HTML.jpg

图 1-17

新笔记本的选项

如您所见,下拉列表分为两个部分,笔记本和其他。您可以创建 Octave 和 Python 3 笔记本。如果您的计算机安装了 Jupyter Notebook 支持的更多编程语言,那么所有这些语言都会显示在这里。您也可以创建文本文件和文件夹。您可以通过点按“终端”在 web 浏览器中打开命令提示符。图 1-18 显示 lxterminal 在单独的 web 浏览器选项卡中运行。

img/515442_1_En_1_Fig18_HTML.jpg

图 1-18

浏览器中的新 lxterminal 窗口

点击下拉列表中的 Python 3,创建一个新的 Python 3 笔记本,如图 1-19 所示。

img/515442_1_En_1_Fig19_HTML.jpg

图 1-19

新的 Python 3 笔记本

如果在浏览器中点击首页标签页再次进入首页,然后在首页打开运行标签页,可以看到终端和 Python 3 笔记本对应的条目,如图 1-20 所示。

img/515442_1_En_1_Fig20_HTML.jpg

图 1-20

当前 jupiter 笔记本子流程摘要

Jupyter 笔记本中的运行代码

再次转到 Python 3 的 Untitled1 选项卡,在文本区域(也称为单元格)中键入以下语句:

printf("Hello, World!\n");

然后点击运行按钮。Jupyter 会将该语句作为 Python 3 语句执行,并在单元格正下方显示结果,如图 1-21 所示。

img/515442_1_En_1_Fig21_HTML.jpg

图 1-21

Jupyter 笔记本中的代码输出

如您所见,在执行之后,它会自动在结果下方创建一个新的单元格,并将光标放在那里。让我们讨论菜单栏和编程单元上方的图标。您可以通过单击软盘图标来保存文件。您可以通过单击+图标在当前单元格后添加一个新的空单元格。接下来的三个图标是剪切、复制和粘贴。使用向上和向下箭头可以分别上下移动当前单元格的位置。下一个选项是运行单元,您已经看到了。接下来的三个图标分别用于中断内核、重启内核和重新运行笔记本中的所有单元。旁边有一个下拉框,告诉您应该是哪种类型的单元格。图 1-22 显示点击时的下拉。

img/515442_1_En_1_Fig22_HTML.jpg

图 1-22

Jupyter 笔记本中的细胞类型

选择代码选项时,该单元被视为 Python 3 代码单元。当您选择降价选项时,它被视为降价单元格。Markdown 是一种可以创建富文本输出的标记语言。例如,任何跟在#后面的都创建一个标题,任何跟在##后面的都创建一个副标题,等等。只需在 Markdown 单元格中键入以下行并执行它们:

# Heading 1
## Heading 2

在我们的 Python 3 演示中,我们将主要对标题使用 Markdown。但是,您可以通过访问 https:// jupyter-notebook 来进一步探索 Markdown。阅读文档。io/en/stable/examples/Notebook/Working %20 含%20 降价% 20 单元。html 。图 1-23 显示了之前演示的输出。

img/515442_1_En_1_Fig23_HTML.jpg

图 1-23

降价中的标题

您甚至可以通过单击笔记本顶部的文件名来更改笔记本文件的名称。点击后,你会看到一个用于重命名的模态框,如图 1-24 所示。

img/515442_1_En_1_Fig24_HTML.jpg

图 1-24

在 Jupyter 中重命名笔记本

如果需要,可以重命名笔记本。如果您在命令提示符下浏览磁盘上启动 Jupyter 笔记本的位置,您会发现扩展名为.ipynb的文件(意思是“IPython 笔记本”)。

同样的,你可以使用 Jupyter Notebook 与其他支持 Jupyter 的编程语言进行交互编程。我们将主要使用这种笔记本格式来存储交互式会话的代码片段。这是因为一切都保存在一个文件中,可以很容易地共享,如前所述。

您可以清除一个单元格或整个笔记本的输出。在菜单栏中,单击单元格菜单。在下拉列表中,“当前输出”和“所有输出”有一个清除选项,用于清除单元格的输出。图 1-25 显示了选项。

img/515442_1_En_1_Fig25_HTML.jpg

图 1-25

清除 Jupyter 中的输出

Jupyter Notebook 最显著的优点之一是,如果有任何语法错误或者您只是想更改代码,您可以编辑已经执行的单元格。Jupyter Notebook 就像一个运行在 web 浏览器中的 IDE,并在同一个窗口中生成输出。这种将代码、富文本和输出保存在同一个文件中的交互性和便利性使得 Jupyter Notebook 项目在世界范围内大受欢迎。运行 Python 程序的内核来自 IPython 项目。正如我前面提到的,您也可以将它用于其他编程语言。我用它来运行 GNU Octave 程序。

您可以在以下网址找到关于 Jupyter Notebook 和 IPython 的更多信息:

https://jupyter.org/
https://ipython.org/

蟒蛇

在我们结束本章之前,我们需要讨论一下 Python 发行版。Python 发行版只不过是与 Python 库捆绑在一起的 Python 解释器。Anaconda 就是这样一个受欢迎的发行版。您可以在 Linux、Windows 和 macOS 上下载并安装 Anaconda。Anaconda 有很多版本。其中一个是免费的,仅供个人使用。你可以在 https://www.anaconda.com/products/individual 找到它。

Anaconda 附带了一个开源的包管理器,可以为 Python 和其他程序安装包。它被称为康达。你可以在 https://docs.conda.io/en/latest/ 找到更多关于康达包管理器的信息。

如果你已经从 Python 的网站安装了 Python,我推荐你用另一台电脑安装 Anaconda。拥有多个解释器和 Python 发行版可能会令人困惑。

摘要

在本章中,你学习了 Python 编程语言的基础。您学习了如何编写基本的 Python 程序,以及如何以各种方式执行它们。您学习了在 Windows 和 Linux 等各种操作系统上使用 Python。您还学习了 Python 编程语言的各种模式,以及如何从各种操作系统的命令提示符下启动 Python。您学习了 Python 内置包管理器 pip 的基础知识。我们还简要讨论了 Python 的其他 ide。

然后,简要介绍了科学 Python 生态系统。我们将在接下来的章节中探索这个生态系统的许多组成部分。您还学习了如何在各种平台上安装 Jupyter Notebook,并探索了如何在 Jupyter Notebook 中运行简单的 Python 语句。您了解了可以将代码和相同代码的输出存储在一个文件中,该文件可以通过 Internet 和其他媒体(如便携式存储设备)轻松共享。

在下一章,我们将从 NumPy 开始。

二、NumPy 入门

在前一章中,您学习了 Python 编程语言和科学 Python 生态系统的基础知识。您还学习了如何使用 Jupyter 在基于 web 的交互式笔记本中运行简单的 Python 程序。在本书剩余章节的大部分演示中,我们将继续使用 Jupyter Notebook。

在这一章中,我们将通过一些代码演示给出 NumPy 库的简要概述。以下是我们将在本章中探讨的主题列表:

  • NumPy Ndarrays 简介

  • n 数组属性

  • NumPy 常量

在本书的剩余章节中,我们将逐一探索科学 Python 生态系统的许多组件。在整本书中,我们将使用不同的库,它们是这个科学 Python 生态系统的一部分。你将在这一章中获得的有价值的知识是其余章节的基础。由于这是一个广泛的生态系统的介绍性章节,所以我把它写得简短而实用。

NumPy 和 Ndarrays

NumPy 是 Python 中数值计算的基础包。我们可以用它来进行数值计算。NumPy 库最有用的特性是被称为 Ndarray 的多维容器数据结构。

Ndarray 是包含具有相同数据类型和大小的项目的多维数组(也称为容器)。我们可以在创建 Ndarray 时定义项目的大小和数据类型。就像列表等其他数据结构一样,我们可以通过索引来访问 Ndarray 的内容。Ndarray 中的索引从 0 开始(就像 C 中的数组或 Python 中的列表)。我们可以使用 Ndarrays 进行各种计算。科学 Python 生态系统中的所有其他库都识别并利用 NumPy Ndarrays 和相关例程来表示它们自己的数据结构和操作。

让我们从动手材料开始。为本章创建新笔记本。运行以下命令在您的计算机上安装 NumPy 库:

!pip3 install numpy

让我们通过运行以下命令将其导入到当前笔记本中:

import numpy as np

您可以创建一个列表,并使用它来创建一个简单的 Ndarray,如下所示:

l1 = [1, 2, 3]
x = np.array(l1, dtype=np.int16)

在这里,您从一个列表中创建了一个 Ndarray。成员的数据类型是 16 位整数。在 https://numpy.org/devdocs/user/basics.types.html 可以找到支持的数据类型的详细列表。

您可以在一行中编写前面的代码,如下所示:

x = np.array([1, 2, 3], dtype=np.int16)

让我们打印 n array 的值和它的类型(我们知道,它是一个 n array)。

print(x)
print(type(x))

输出如下所示:

[1 2 3]
<class 'numpy.ndarray'>

正如您在前面的输出中所看到的,它属于类numpy.ndarray

你也可以使用 Python 的交互模式来运行所有的语句,如图 2-1 所示。

img/515442_1_En_2_Fig1_HTML.jpg

图 2-1

在 Python shell 中以交互模式运行示例代码

您也可以在 Python shell 中运行您将在本书中练习的大多数代码示例。类似地,您可以通过在命令提示符下键入命令ipython来启动 IPython shell,然后运行代码示例,如图 2-2 所示。

img/515442_1_En_2_Fig2_HTML.jpg

图 2-2

在 IPython shell 中以交互模式运行示例代码

虽然您可以使用 Python 交互式 shell 和 IPython 来运行代码示例,但是不可能使用这些工具将代码、输出和其他资源(如富文本标题)保存在一个文件中,因此在本书中我们将主要使用 Jupyter 笔记本文件(*.ipynb文件)。在一些情况下,我们也将使用 Python 脚本模式程序(*.py文件)。

Ndarrays 中的索引

让我们简单看一下 Ndarrays 的索引。正如您之前简要了解到的,索引从 0 开始。让我们通过访问 Ndarray 的成员来演示一下,如下所示:

print(x[0]); print(x[1]); print(x[2])

输出如下所示:

1
2
3

您甚至可以使用负索引:-1 返回最后一个元素,-2 返回倒数第二个元素,依此类推。下面是一个例子:

print(x[-1])

如果您提供了任何无效的索引,那么它将抛出一个错误。

print(x[3])

在前面的语句中,您试图访问 Ndarray 中不存在的第四个元素。这将返回以下错误:

IndexError                    Traceback (most recent call last)
<ipython-input-4-d3c02b9c2b5d> in <module>
----> 1 print(x[3])

IndexError: index 3 is out of bounds for axis 0 with size 3

在多个维度的数组中建立索引

一个数组可以有多个维度,如下所示:

x1 = np.array([[1, 2, 3], [4, 5, 6]], np.int16)

前面是一个二维矩阵。它有两行三列。您可以按如下方式访问单个元素:

print(x1[0, 0]); print(x1[0, 1]); print(x1[0, 2]);

您甚至可以访问整行,如下所示:

print(x1[0, :])
print(x1[1, :])

输出如下所示:

[1 2 3]
[4 5 6]

您可以按如下方式访问整个列:

print(x[:, 0])

输出如下所示:

[1 4]

你甚至可以有一个二维以上的数组。以下是一个 3D 数组:

x2 = np.array([[[1, 2, 3], [4, 5, 6]],[[0, -1, -2], [-3, -4, -5]]], np.int16)

在科学和商业应用中,经常会有多维数据。Ndarrays 对于存储数字数据很有用。尝试运行以下项目并检索先前 3D 矩阵的元素:

print(x2[0, 0, 0])
print(x2[1, 1, 2])
print(x2[:, 1, 1])

n 数组属性

您可以通过参考 Ndarrays 的属性来了解更多关于它们的信息。让我们通过一个演示来看看所有的属性。具体来说,让我们使用我们之前使用的相同的 3D 矩阵。

x2 = np.array([[[1, 2, 3], [4, 5, 6]],[[0, -1, -2], [-3, -4, -5]]], np.int16)

您可以使用以下语句找出维数:

print(x2.ndim)

输出返回维数。

3

您可以找出 n 数组的形状,如下所示:

print(x2.shape)

形状是指以下尺寸的大小:

(2, 2, 3)

您可以找出成员的数据类型,如下所示:

print(x2.dtype)

输出如下所示:

int16

您可以按如下方式找出存储器所需的大小(元素数量)和字节数:

print(x2.size)
print(x2.nbytes)

输出如下所示:

12
24

您可以使用以下代码计算转置:

print(x2.T)

NumPy 常量

NumPy 库有许多有用的数学和科学常数,可以在程序中使用。下面的代码片段打印了所有这些重要的常量。

以下代码片段引用了 infinity:

print(np.inf)

以下代码片段引用的不是数字:

print(np.NAN)

以下代码片段引用了负无穷大:

print(np.NINF)

以下代码片段引用了负数和正数零:

print(np.NZERO)
print(np.PZERO)

以下代码片段引用了欧拉数:

print(np.e)

以下代码片段引用了 Euler 的 gamma 和 pi:

print(np.euler_gamma)
print(np.pi)

输出如下所示:

inf
nan
-inf
-0.0
0.0
2.718281828459045
0.5772156649015329
3.141592653589793

切片数组

让我们看看 Ndarrays 上切片操作的例子。您可以使用索引通过切片提取 Ndarray 的一部分,如下所示:

a1 = np.array([1, 2, 3, 4, 5, 6, 7])
a1[1:5]

这段代码将显示从第二个位置到第六个位置的元素(您知道 0 是起始索引),如下所示:

array([2, 3, 4, 5])

您可以显示第四个位置的元素,如下所示:

a1[3:]

输出如下所示:

array([4, 5, 6, 7])

您还可以显示特定索引之前的所有元素(不包括该索引处的元素),如下所示:

a1[:3]

输出如下所示:

array([1, 2, 3])

你看到了负指数的使用。我们可以使用它们进行切片,如下所示:

a1[-4:-1]

输出如下所示:

array([4, 5, 6])

您已经以步长 1 对数据进行了切片。这意味着您正在检索结果集中的连续元素。您也可以按如下方式更改步长:

a1[1:6:2]

在本例中,步长为 2。因此,输出将列出每隔一个元素。输出如下所示:

array([2, 4, 6])

摘要

在本章中,您开始学习 NumPy 和 Ndarrays 的基础知识。这是一个有很多例程的大库。有整本书是献给 NumPy 的。然而,我们的出版限制不允许对这个有用的库进行那种探索。我们将在接下来的章节中探索更多来自 NumPy 库的例程,当我们的可视化演示需要它们时。

在下一章中,你将学习一些 Ndarray 创建例程和 Matplotlib 数据可视化的基础知识。

三、NumPy 例程和 Matplotlib 入门

在前一章中,您学习了 NumPy 的基础知识。具体来说,您学习了如何安装它以及如何创建 Ndarrays。你在前一章学到的所有主题将作为后面章节的基础,因为 Ndarray 是我们将在整本书中使用的基本数据结构。

在这一章中,我们将从上一章停止的地方继续,看看几个 Ndarray 创建例程。我们还将从科学计算生态系统中的主要数据可视化库 Matplotlib 开始。我们将使用 NumPy 的 Ndarray 创建例程来演示 Matplotlib 的可视化。这是一个详细的章节,非常强调编程和可视化。以下是您将在本章中了解的主题:

  • 创建 n 数组的例程

  • Matplotlib

  • 用 NumPy 和 Matplotlib 实现可视化

在本书的其余章节中,我们将经常使用 Matplotlib 和 NumPy 来演示数据可视化。

创建 n 数组的例程

让我们学习创建 1 和 0 的 n 数组。在这一节中,我们将探索许多数组创建例程。使用 Jupyter Notebook 创建一个新笔记本来保存本章的代码。返回给定形状和类型的新数组,不初始化条目。由于对应于成员的条目没有初始化,所以它们是任意的(随机的)。让我们来看一个小演示。在笔记本的单元格中键入以下代码并运行它:

import numpy as np
x = np.empty([3, 3], np.uint8)
print(x)

输出如下所示:

[[ 64 244  49]
 [  4   1   0]
 [  0   0 124]]

请注意,每个执行实例的值都不同,因为它不会在创建矩阵时初始化这些值。您可以创建任意大小的矩阵,如下所示:

x = np.empty([3, 3, 3], np.uint8)
print(x)

函数np.eye()返回一个 2D 矩阵,对角线为 1,其他元素为 0。下面是一个例子:

y = np.eye(5, dtype=np.uint8)
print(y)

输出如下所示:

[[1 0 0 0 0]
 [0 1 0 0 0]
 [0 0 1 0 0]
 [0 0 0 1 0]
 [0 0 0 0 1]]

您可以更改对角线索引的位置。默认值为 0,表示主对角线。正值表示上对角线。负值表示对角线较低。以下是一些例子。让我们先演示一下上面的对角线:

y = np.eye(5, dtype=np.uint8, k=1)
print(y)

输出如下所示:

[[0 1 0 0 0]
 [0 0 1 0 0]
 [0 0 0 1 0]
 [0 0 0 0 1]
 [0 0 0 0 0]]

下面是演示下对角线的代码:

y = np.eye(5, dtype=np.uint8, k=-1)
print(y)

输出如下所示:

[[0 0 0 0 0]
 [1 0 0 0 0]
 [0 1 0 0 0]
 [0 0 1 0 0]
 [0 0 0 1 0]]

一个单位矩阵是对角线上所有元素都是 1,其余元素都是 0 的矩阵。函数np.identity()返回指定大小的单位矩阵,如下所示:

x = np.identity(5, dtype= np.uint8)
print(x)

前面的代码与下面的代码产生相同的输出:

y = np.eye(5, dtype=np.uint8)
print(y)

这两种方法的输出如下:

[[1 0 0 0 0]
 [0 1 0 0 0]
 [0 0 1 0 0]
 [0 0 0 1 0]
 [0 0 0 0 1]]

函数np.ones()返回给定大小的矩阵,该矩阵的所有元素都为 1。

x = np.ones((2, 5, 5), dtype=np.int16)
print(x)

运行代码,您将看到以下输出:

[[[1 1 1 1 1]
  [1 1 1 1 1]
  [1 1 1 1 1]
  [1 1 1 1 1]
  [1 1 1 1 1]]

 [[1 1 1 1 1]
  [1 1 1 1 1]
  [1 1 1 1 1]
  [1 1 1 1 1]
  [1 1 1 1 1]]]

函数np.zeroes()返回一个给定大小的矩阵,所有元素都为 0。

x = np.zeros((2, 5, 5, 2), dtype=np.int16)
print(x)

运行代码并检查输出。

函数np.full()返回一个给定形状和类型的新数组,用传递的参数填充。这里有一个例子:

x = np.full((3, 3, 3), dtype=np.int16, fill_value = 5)
print(x)

输出如下所示:

[[[5 5 5]
  [5 5 5]
  [5 5 5]]

 [[5 5 5]
  [5 5 5]
  [5 5 5]]

 [[5 5 5]
  [5 5 5]
  [5 5 5]]]

一个下三角矩阵就是对角线和对角线以下的所有元素都是 1,其余元素都是 0。函数np.tri()返回给定大小的下三角矩阵,如下所示:

x = np.tri(3, 3, k=0, dtype=np.uint16)
print(x)

输出如下所示:

[[1 0 0]
 [1 1 0]
 [1 1 1]]

你甚至可以改变次对角线的位置。次对角线以下的所有元素都将为 0。

x = np.tri(5, 5, k=1, dtype=np.uint16)
print(x)

输出如下所示:

[[1 1 0 0 0]
 [1 1 1 0 0]
 [1 1 1 1 0]
 [1 1 1 1 1]
 [1 1 1 1 1]]

次对角线为负值的另一个示例如下:

x = np.tri(5, 5, k=-1, dtype=np.uint16)
print(x)

输出如下所示:

[[0 0 0 0 0]
 [1 0 0 0 0]
 [1 1 0 0 0]
 [1 1 1 0 0]
 [1 1 1 1 0]]

类似地,您可以使用函数np.tril()来获得下三角矩阵。它接受另一个矩阵作为参数。这里有一个演示:

x = np.ones((5, 5), dtype=np.uint8)
y = np.tril(x, k=-1)
print(y)

输出如下所示:

[[0 0 0 0 0]
 [1 0 0 0 0]
 [1 1 0 0 0]
 [1 1 1 0 0]
 [1 1 1 1 0]]

上三角矩阵的对角线和上面所有的元素都是 1,其余的元素都是 0。

x = np.ones((5, 5), dtype=np.uint8)
y = np.triu(x, k=0)
print(y)

输出如下所示:

[[1 1 1 1 1]
 [0 1 1 1 1]
 [0 0 1 1 1]
 [0 0 0 1 1]
 [0 0 0 0 1]]

你可以有一个负的次对角线,如下所示:

x = np.ones((5, 5), dtype=np.uint8)
y = np.triu(x, k=-1)
print(y)

输出如下所示:

[[1 1 1 1 1]
 [1 1 1 1 1]
 [0 1 1 1 1]
 [0 0 1 1 1]
 [0 0 0 1 1]]

你可以有一个负的次对角线,如下所示:

x = np.ones((5, 5), dtype=np.uint8)
y = np.triu(x, k=1)
print(y)

输出如下所示:

[[0 1 1 1 1]
 [0 0 1 1 1]
 [0 0 0 1 1]
 [0 0 0 0 1]
 [0 0 0 0 0]]

Matplotlib

Matplotlib 是科学 Python 生态系统不可或缺的一部分,它用于可视化。它是 NumPy 的扩展。它为绘图和可视化提供了一个类似 Matlab 的界面。它最初是由 John D. Hunter 开发的,作为可用于 Python 的开源替代方案。

您可以使用 Jupyter 笔记本进行安装,如下所示:

!pip3 install matplotlib

注意pip3命令前的!符号。这是因为当你想在笔记本上运行一个操作系统命令时,你必须给它加上前缀!

在安装 Matplotlib 库之前,您可能希望使用以下命令升级 pip:

!python -m pip install --upgrade pip

要在笔记本中使用 Matplotlib 库进行基本绘图,必须导入其pyplot模块,如下所示:

import matplotlib.pyplot as plt

pyplot模块提供了一个类似 Matlab 的界面来创建可视化。此外,要在笔记本中显示 Matplotlib 可视化效果,必须运行以下神奇命令:

%matplotlib inline

这迫使 Matlab 在产生可视化的代码单元格的正下方内联显示输出。当我们需要使用 Matplotlib 时,我们会一直使用它。

让我们也导入 NumPy,如下所示:

import numpy as np

你可以在 https://matplotlib.org/ 阅读更多关于 Matplotlib 的内容。

用 NumPy 和 Matplotlib 实现可视化

您现在将学习如何使用 Ndarray 创建例程创建 NumPy Ndarrays,然后使用 Matplotlib 来可视化它们。让我们从创建 Ndarrays 的例程开始。

第一个套路是arange()。它以给定的间隔创建均匀分布的值。停止值参数是必需的。起始值和间隔参数分别具有默认参数 0 和 1。这里有一个例子:

x = np.arange(6)

在前面的示例中,停止值为 5。因此,它创建了一个从 0 开始到 4 结束的 Ndarray。该函数返回具有半开间隔的序列,这意味着停止值不包括在输出中。因为我们没有指定时间间隔,所以假设它为 1。您可以看到其输出和数据类型,如下所示:

print(x)
type(x)

输出如下所示:

[0 1 2 3 4 5]
numpy.ndarray

让我们继续绘制这些数字。为了在 2D 绘图,我们需要 x-y 对。让我们保持简单,通过运行下面的语句来说 y = f(x) = x:

y=x+1

现在,让我们使用函数plot()来形象化这一点。它需要xy的值以及绘图选项。您将在本章的后面了解更多关于绘图选项的内容。

plt.plot(x, y, 'o--')
plt.show()

功能show()显示绘图。如你所见,我们用绘图选项o--进行可视化。这意味着点用实心圆表示,线用虚线表示,如图 3-1 所示。

img/515442_1_En_3_Fig1_HTML.jpg

图 3-1

形象化 y=f(x)=x+1

下面是一个带有开始和停止参数的函数arange()的函数调用示例:

np.arange(2, 6)

它返回以下输出(它直接打印,我们没有将它存储在变量中):

array([2, 3, 4, 5])

我们甚至可以为间隔添加一个参数,如下所示:

np.arange(2, 6, 2)

输出如下所示:

array([2, 4])

我们可以绘制如下多个图形:

plt.plot(x, y, 'o--')
plt.plot(x, -y, 'o-')
plt.show()

输出将有一条线和另一条虚线,如图 3-2 所示。

img/515442_1_En_3_Fig2_HTML.jpg

图 3-2

可视化多条线

您甚至可以为图表添加标题,如下所示:

plt.plot(x, y, 'o--')
plt.plot(x, -y, 'o-')
plt.title('y=x and y=-x')
plt.show()

输出的标题如图 3-3 所示。

img/515442_1_En_3_Fig3_HTML.jpg

图 3-3

可视化多行和标题

函数linspace(start, stop, number)返回指定间隔内均匀分布的数字数组。您必须向其传递起始值、结束值以及值的数量,如下所示:

N = 16
x = np.linspace(0, 15, N)
print(x)

前面的代码创建了 11 个数字(0 到 10,包括 0 和 10),如下所示:

[ 0\.  1\.  2\.  3\.  4\.  5\.  6\.  7\.  8\.  9\. 10\. 11\. 12\. 13\. 14\. 15.]

让我们想象一下:

y = x
plt.plot(x, y, 'o--')
plt.axis('off')
plt.show()

图 3-4 显示了输出。

img/515442_1_En_3_Fig4_HTML.jpg

图 3-4

使用 linspace()时 y = x 的输出

如你所见,我们正在用线plt.axis('off')关闭轴。

同样,您可以按如下方式计算并可视化日志空间中的值:

y = np.logspace(0.1, 2, N)
print(y)
plt.plot(x, y, 'o--')
plt.show()

打印功能的输出如下:

[  1.25892541   1.68525904   2.25597007   3.01995172   4.04265487
   5.41169527   7.2443596    9.69765359  12.98175275  17.37800829
  23.26305067  31.14105584  41.68693835  55.80417175  74.70218989
 100\.        ]

图 3-5 显示了输出。

img/515442_1_En_3_Fig5_HTML.jpg

图 3-5

日志空间的输出()

你甚至可以计算一个几何级数,如下所示:

y = np.geomspace(0.1, 2000, N)
print(y)
plt.plot(x, y, 'o--')
plt.show()

print语句的输出如下:

[1.00000000e-01 1.93524223e-01 3.74516250e-01 7.24779664e-01
 1.40262421e+00 2.71441762e+00 5.25305561e+00 1.01659351e+01
 1.96735469e+01 3.80730788e+01 7.36806300e+01 1.42589867e+02
 2.75945932e+02 5.34022222e+02 1.03346236e+03 2.00000000e+03]

图 3-6 显示了输出。

img/515442_1_En_3_Fig6_HTML.jpg

图 3-6

geomspace()的输出

将 Matplotlib 程序作为脚本运行

可以使用 Python 的脚本模式运行 Matplotlib 程序。将清单 3-1 中显示的程序另存为prog01.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(6)
print(x)
type(x)

y=x+1

plt.plot(x, y, 'o--')
plt.show()

Listing 3-1prog01.py

当你运行这个程序时,输出显示在一个单独的窗口中,如图 3-7 所示。

img/515442_1_En_3_Fig7_HTML.jpg

图 3-7

在单独的窗口中输出

我们将主要使用 Jupyter Notebook 在浏览器窗口中显示可视化效果。

摘要

本章重点介绍了创建 Ndarrays 的例程。您还学习了 Matplotlib 的基础知识。除了基础知识之外,您还学习了如何用简单的图形可视化 Ndarrays。NumPy 和 Matplotlib 的内容比您在本章中学到的更多。还有许多数字和数据可视化例程。

在下一章中,您将探索更多这样的处理 NumPy Ndarrays 的 NumPy 例程。

四、重温 Matplotlib 可视化

在前一章中,您学习了在 NumPy 库中创建和操作 Ndarrays 的许多例程。在这本书里,你会需要很多这样的程序。

本章致力于探索用 Matplotlib 准备的可视化的美学方面。您将学习如何定制 Matplotlib 可视化的外观。具体来说,我们将详细探讨以下主题:

  • 单线图

  • 多线图

  • 网格、轴和标签

  • 颜色、线条和标记

  • 支线剧情

  • 面向对象的风格

  • 使用文本

在阅读完这一章之后,你将能够以编程的方式定制你的可视化的美学方面,使它们更美观。

单线图

当一个图形中只有一个使用函数plot()的可视化时,它被称为单线图。在本节中,您将看到绘制单线图的几种方法。我们已经使用了函数plot()来绘制单线图。让我们用几个更具体的例子来更详细地探讨这个概念。

为本章中的演示创建一个新笔记本。您还可以使用 Python 列表来可视化绘图,如下所示:

%matplotlib inline
import matplotlib.pyplot as plt
x = [4, 5, 3, 1, 6, 7]
plt.plot(x)
plt.show()

图 4-1 显示了输出。

img/515442_1_En_4_Fig1_HTML.jpg

图 4-1

演示一个简单的单线图

在这种情况下,y 轴的值是假定的。

下面是另一个使用 n 数组的单线图示例:

import numpy as np
x = np.arange(25)
plt.plot(x)
plt.show()

图 4-2 显示了输出。

img/515442_1_En_4_Fig2_HTML.jpg

图 4-2

带有 arange()的简单单线图

我们来形象化的描述一下二次图 y = f(x) = x 3 +1。代码如下:

plt.plot(x, [(y**3 + 1) for y in x])
plt.show()

图 4-3 显示了输出。

img/515442_1_En_4_Fig3_HTML.jpg

图 4-3

y = f(x) = x 3 +1

您可以用简单的方式编写相同的代码,如下所示:

plt.plot(x, x**3 + 1)
plt.show()

多线图

可以在同一输出中显示多个图。让我们看看如何在同一个可视化中显示多条曲线。下面是一个简单的例子:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(7)
plt.plot(x, -x**2)
plt.plot(x, -x**3)
plt.plot(x, -2*x)
plt.plot(x, -2**x)
plt.show()

图 4-4 显示了输出。

img/515442_1_En_4_Fig4_HTML.jpg

图 4-4

多线图

如您所见,Matplotlib 自动为曲线单独分配颜色。

您可以用简单的方式编写相同的代码,如下所示:

plt.plot(x, -x**2, x, -x**3,
         x, -2*x, x, -2**x)
plt.show()

输出将与图 4-4 相同。

让我们看另一个例子:

x = np.array([[3, 2, 5, 6], [7, 4, 1, 5]])
plt.plot(x)
plt.show()

图 4-5 显示了输出。

img/515442_1_En_4_Fig5_HTML.jpg

图 4-5

多线图,另一个例子

您也可以使用随机数据创建多行图形,如下所示:

data = np.random.randn(2, 10)
print(data)
plt.plot([data[0], data[1]])
plt.show()

图 4-6 显示了输出。

img/515442_1_En_4_Fig6_HTML.jpg

图 4-6

多线图,随机数据

在本例中,我们使用例程np.random.randn()以随机方式生成数据。因为这个例程会生成随机数据,所以每次执行时输出都会不同。因此,每次执行代码时,您看到的输出都是不同的。

网格、轴和标签

现在,您将学习如何在可视化中启用网格。这可以通过语句plt.grid(True)来完成。您还将学习如何操作轴的限制。但在此之前,您将很快学会如何在硬盘上将可视化保存为图像。请看下面的代码:

x = np.arange(3)
plt.plot(x, -x**2, x, -x**3, x, -2*x, x, -2**x)
plt.grid(True)
plt.savefig('test.png')
plt.show()

语句plt.savefig('test.png')将图像保存在 Jupyter 笔记本文件的当前目录中。图 4-7 显示输出。

img/515442_1_En_4_Fig7_HTML.jpg

图 4-7

多线图

您可以看到轴的限制默认设置如下:

x = np.arange(3)
plt.plot(x, -x**2, x, -x**3, x, -2*x, x, -2**x)
plt.grid(True)
print(plt.axis())
plt.show()

图 4-8 显示了输出。

img/515442_1_En_4_Fig8_HTML.png

图 4-8

查看轴的值

您也可以自定义轴的值,如下所示:

x = np.arange(3)
plt.plot(x, -x**2, x, -x**3, x, -2*x, x, -2**x)
plt.grid(True)
plt.axis([0, 2, -8, 0])
print(plt.axis())
plt.show()

语句plt.axis([0, 2, -8, 0])设置轴的值。第一对(0,2)指 x 轴的极限,第二对(-8,0)指 y 轴的极限。您可以使用函数xlim()ylim()用不同的语法编写前面的代码,如下所示:

x = np.arange(3)
plt.plot(x, -x**2, x, -x**3, x, -2*x, x, -2**x)
plt.grid(True)
plt.xlim([0, 2])
plt.ylim([-8, 0])
print(plt.axis())
plt.show()

两个示例产生相同的输出,如图 4-9 所示。

img/515442_1_En_4_Fig9_HTML.png

图 4-9

自定义轴

您可以为轴添加标题和标签,如下所示:

x = np.arange(3)
plt.plot(x, -x**2, x, -x**3, x, -2*x, x, -2**x)
plt.grid(True)
plt.xlabel('x = np.arange(3)')
plt.xlim([0, 2])
plt.ylabel('y = f(x)')
plt.ylim([-8, 0])
plt.title('Simple Plot Demo')
plt.show()

这将产生标签和标题如图 4-10 所示的输出。

img/515442_1_En_4_Fig10_HTML.jpg

图 4-10

可视化的标题和轴的标签

您可以在plot()函数中为参数label传递一个参数,然后调用函数legend()来创建一个图例,如下所示:

x = np.arange(3)
plt.plot(x, -x**2, label='-x**2')
plt.plot(x, -x**3, label='-x**3')
plt.plot(x, -2*x, label='-2*x')
plt.plot(x, -2**x, label='-2**x')
plt.legend()
plt.grid(True)
plt.xlabel('x = np.arange(3)')
plt.xlim([0, 2])
plt.ylabel('y = f(x)')
plt.ylim([-8, 0])
plt.title('Simple Plot Demo')
plt.show()

该代码产生带有曲线图例的输出,如图 4-11 所示。

img/515442_1_En_4_Fig11_HTML.jpg

图 4-11

带图例的输出

除了将图例字符串作为参数传递给函数plot(),还可以将字符串列表作为参数传递给函数legend(),如下所示:

x = np.arange(3)
plt.plot(x, -x**2, x, -x**3, x, -2*x, x, -2**x)
plt.legend(['-x**2', '-x**3', '-2*x', '-2**x'])
plt.grid(True)
plt.xlabel('x = np.arange(3)')
plt.xlim([0, 2])
plt.ylabel('y = f(x)')
plt.ylim([-8, 0])
plt.title('Simple Plot Demo')
plt.show()

这产生了与图 4-11 相同的输出。

您也可以通过对前面代码中的plt.legend()进行以下更改来更改图例框的位置:

x = np.arange(3)
plt.plot(x, -x**2, x, -x**3, x, -2*x, x, -2**x)
plt.legend(['-x**2', '-x**3', '-2*x', '-2**x'],
           loc='lower center')
plt.grid(True)
plt.xlabel('x = np.arange(3)')
plt.xlim([0, 2])
plt.ylabel('y = f(x)')
plt.ylim([-8, 0])
plt.title('Simple Plot Demo')
plt.show()

图 4-12 显示了输出。

img/515442_1_En_4_Fig12_HTML.jpg

图 4-12

图例位于中上位置的输出

最后,让我们用下面的代码将可视化保存到磁盘:

x = np.arange(3)
plt.plot(x, -x**2, x, -x**3, x, -2*x, x, -2**x)
plt.legend(['-x**2', '-x**3', '-2*x', '-2**x'],
           loc='lower center')
plt.grid(True)
plt.xlabel('x = np.arange(3)')
plt.xlim([0, 2])
plt.ylabel('y = f(x)')
plt.ylim([-8, 0])
plt.title('Simple Plot Demo')
plt.savefig('test.png')
plt.show()

颜色、样式和标记

到目前为止,在多行绘图的情况下,您已经看到 Matplotlib 自动分配颜色、样式和标记。您已经看到了一些如何定制它们的例子。现在,在本节中,您将学习如何详细定制它们。

先说颜色。以下代码列出了 Matplotlib 支持的所有原色(在此示例中,我们不自定义样式和标记):

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = x
plt.plot(x, y+0.4, 'g')
plt.plot(x, y+0.2, 'y')
plt.plot(x, y, 'r')
plt.plot(x, y-0.2, 'c')
plt.plot(x, y-0.4, 'k')
plt.plot(x, y-0.6, 'm')
plt.plot(x, y-0.8, 'w')
plt.plot(x, y-1, 'b')
plt.show()

图 4-13 显示了输出。

img/515442_1_En_4_Fig13_HTML.jpg

图 4-13

颜色演示

您也可以编写前面的代码,如下所示:

plt.plot(x, y+0.4, 'g', x, y+0.2, 'y', x, y, 'r', x, y-0.2, 'c', x, y-0.4, 'k', x, y-0.6, 'm', x, y-0.8, 'w', x, y-1, 'b')
plt.show()

输出将与图 4-13 相同。

您可以自定义线条样式,如下所示:

plt.plot(x, y, '-', x, y+1, '--', x, y+2, '-.', x, y+3, ':')
plt.show()

图 4-14 显示了输出。

img/515442_1_En_4_Fig14_HTML.jpg

图 4-14

线条样式

您甚至可以按如下方式更改标记:

plt.plot(x, y, '.')
plt.plot(x, y+0.5, ',')
plt.plot(x, y+1, 'o')
plt.plot(x, y+2, '<')
plt.plot(x, y+3, '>')
plt.plot(x, y+4, 'v')
plt.plot(x, y+5, '^')
plt.plot(x, y+6, '1')
plt.plot(x, y+7, '2')
plt.plot(x, y+8, '3')
plt.plot(x, y+9, '4')
plt.plot(x, y+10, 's')
plt.plot(x, y+11, 'p')
plt.plot(x, y+12, '*')
plt.plot(x, y+13, 'h')
plt.plot(x, y+14, 'H')
plt.plot(x, y+15, '+')
plt.plot(x, y+16, 'D')
plt.plot(x, y+17, 'd')
plt.plot(x, y+18, '|')
plt.plot(x, y+19, '_')
plt.show()

图 4-15 显示了输出。

img/515442_1_En_4_Fig15_HTML.jpg

图 4-15

标记

您可以结合所有三种技术(针对颜色、标记和线条样式)来自定义可视化,如下所示:

plt.plot(x, y, 'mo--')
plt.plot(x, y+1 , 'g*-.')
plt.show()

图 4-16 显示了输出。

img/515442_1_En_4_Fig16_HTML.jpg

图 4-16

定制一切

这些是您可以在 Matplotlib 中进行的基本自定义。您可以非常详细地定制一切。下面是一个代码示例:

plt.plot(x, y, color='g', linestyle='--', linewidth=1.5,
        marker='^', markerfacecolor='b', markeredgecolor='k',
        markeredgewidth=1.5, markersize=5)
plt.grid(True)
plt.show()

图 4-17 显示了输出。

img/515442_1_En_4_Fig17_HTML.jpg

图 4-17

更加详细地定制一切

您甚至可以自定义 x 轴和 y 轴上的值,如下所示:

x = y = np.arange(10)
plt.plot(x, y, 'o--')
plt.xticks(range(len(x)), ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
plt.yticks(range(0, 10, 1))
plt.show()

图 4-18 显示了输出。

img/515442_1_En_4_Fig18_HTML.jpg

图 4-18

自定义轴上的记号

面向对象绘图

您可以以面向对象的方式创建地块。让我们重写一个早期的代码示例,如下所示:

fig, ax = plt.subplots()
ax.plot(x, -x**2, label='-x**2')
ax.plot(x, -x**3, label='-x**3')
ax.plot(x, -2*x, label='-2*x')
ax.plot(x, -2**x, label='-2**x')
ax.set_xlabel('x = np.arange(3)')
ax.set_ylabel('y = f(x)')
ax.set_title('Simple Plot Demo')
ax.legend()
ax.grid(True)
plt.show()

注意,我们使用 axis 对象来绘制和设置标签和标题。图 4-19 显示了输出。

img/515442_1_En_4_Fig19_HTML.jpg

图 4-19

面向对象绘图的输出

您也可以使用功能ax.text()或功能plt.text()添加文本。这些函数接受要显示的坐标和文本。下面是一个例子:

fig, ax = plt.subplots()
ax.plot(x, -x**2, label='-x**2')
ax.plot(x, -x**3, label='-x**3')
ax.plot(x, -2*x, label='-2*x')
ax.plot(x, -2**x, label='-2**x')
ax.set_xlabel('x = np.arange(3)')
ax.set_ylabel('y = f(x)')
ax.set_title('Simple Plot Demo')
ax.legend()
ax.grid(True)
ax.text(0.25, -5, "Simple Plot Demo")
plt.show()

图 4-20 显示了输出。

img/515442_1_En_4_Fig20_HTML.jpg

图 4-20

呈现文本

支线剧情

您可以在同一个输出中显示多个单独的图形。这种技术被称为副音色。支线剧情可以有自己的标题、标签和其他说明。支线剧情是在网格中创建的。第一个支线剧情位置在左上方。其他子绘图位置相对于第一个位置。下面是一个例子:

x = np.arange(3)
plt.subplots_adjust(wspace=0.3,
                    hspace=0.3)
plt.subplot(2, 2, 1)
plt.plot(x, -x**2)
plt.subplot(2, 2, 2)
plt.plot(x, -x**3)
plt.subplot(2, 2, 3)
plt.plot(x, -2*x)
plt.subplot(2, 2, 4)
plt.plot(x, -2**x)
plt.show()

传递给plt.subplot()的前两个参数表示网格大小,第三个参数表示特定子绘图的位置。图 4-21 显示输出。

img/515442_1_En_4_Fig21_HTML.jpg

图 4-21

支线剧情

您可以用面向对象的方式编写相同的代码,如下所示:

fig, axs = plt.subplots(2, 2)
plt.subplots_adjust(wspace=0.3,
                    hspace=0.3)
axs[0, 0].plot(x, -x**2)
axs[0, 1].plot(x, -x**3)
axs[1, 0].plot(x, -2*x)
axs[1, 1].plot(x, -2**x)
plt.show()

代码产生与图 4-21 所示相同的输出。

摘要

本章着重于可视化和各种定制。您学到了很多关于数据可视化和根据需求定制可视化的知识。您还了解了面向对象的绘图风格和支线剧情。你在本章中学到的概念将在本书中用来可视化数据。

在下一章,我们将探索更多的样式表、图例和布局计算。