Matplotlib - 快速指南


Matplotlib - 简介

Matplotlib 是用于数据可视化的最流行的 Python 软件包之一。它是一个跨平台库,用于根据数组中的数据制作 2D 绘图。Matplotlib 用 Python 编写,并使用 NumPy(Python 的数值数学扩展)。它提供了面向对象的 API,有助于使用 Python GUI 工具包(例如 PyQt、WxPythonotTkinter)在应用程序中嵌入绘图。它也可以在 Python 和 IPython shell、Jupyter Notebook 和 Web 应用程序服务器中使用。

Matplotlib 有一个名为 Pylab 的程序接口,其设计类似于 MATLAB(一种由 MathWorks 开发的专有编程语言)。Matplotlib 和 NumPy 可以被视为 MATLAB 的开源版本。

Matplotlib 最初由 John D. Hunter 于 2003 年编写。当前稳定版本是 2018 年 1 月发布的 2.2.0。

Matplotlib - 环境设置

Matplotlib 及其依赖包在标准 Python 包存储库中以 Wheel 包的形式提供,并且可以使用 pip 包管理器安装在 Windows、Linux 以及 MacOS 系统上。

pip3 install matplotlib

如果未为所有用户安装 Python 2.7 或 3.4 版本,则需要安装 Microsoft Visual C++ 2008(Python 2.7 为 64 位或 32 位)或 Microsoft Visual C++ 2010(Python 3.4 为 64 位或 32 位)可再发行软件包。

如果您在 Mac 上使用 Python 2.7,请执行以下命令 -

xcode-select –install

执行上述命令后,可以编译 subprocess32 - 依赖项。

在极旧版本的 Linux 和 Python 2.7 上,您可能需要安装 subprocess32 的主版本。

Matplotlib 需要大量依赖项 -

  • Python(>= 2.7 或 >= 3.4)
  • 数值模拟
  • 设置工具
  • 日期工具
  • py解析
  • 库文件
  • 皮兹
  • 自由类型
  • 循环仪

您还可以选择安装许多软件包以启用更好的用户界面工具包。

  • 知识库
  • PyQt4
  • PyQt5
  • pygtk
  • wxpython
  • 皮开罗
  • 龙卷风

为了更好地支持动画输出格式和图像文件格式、LaTeX等,您可以安装以下内容 -

  • _mpeg/avconv
  • 图像魔术师
  • Pillow (>=2.0)
  • LaTeX 和 GhostScript(用于使用 LaTeX 渲染文本)。
  • LaTeX 和 GhostScript(用于使用 LaTeX 渲染文本)。

Matplotlib - Anaconda 分布

Anaconda 是 Python 和 R 编程语言的免费开源发行版,用于大规模数据处理、预测分析和科学计算。该发行版使包管理和部署变得简单容易。Matplotlib 和许多其他有用的(数据)科学工具构成了该发行版的一部分。包版本由包管理系统 Conda 管理。Anaconda 的优势在于您可以访问超过 720 个软件包,这些软件包可以使用 Anaconda 的 Conda(软件包、依赖项和环境管理器)轻松安装。

Anaconda 发行版可在https://www.anaconda.com/download/ 上安装。对于 Windows 上的安装,可以使用 32 位和 64 位二进制文​​件 -

https://repo.continuum.io/archive/Anaconda3-5.1.0-Windows-x86.exe

https://repo.continuum.io/archive/Anaconda3-5.1.0-Windows-x86_64.exe

安装是一个相当简单的基于向导的过程。您可以选择在 PATH 变量中添加 Anaconda 或将 Anaconda 注册为默认 Python。

对于 Linux 上的安装,请从下载页面下载 32 位和 64 位安装程序的安装程序 -

https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86.sh

https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh

现在,从 Linux 终端运行以下命令 -

$ bash Anaconda3-5.0.1-Linux-x86_64.sh

Canopy 和 ActiveState 是 Windows、macOS 和常见 Linux 平台最受欢迎的选择。Windows 用户可以在 WinPython 中找到一个选项。

Matplotlib - Jupyter 笔记本

Jupyter 是一个松散的缩写词,意思是 Julia、Python 和 R。这些编程语言是 Jupyter 应用程序的第一个目标语言,但如今,笔记本技术还支持许多其他语言。

2001 年,Fernando Pérez 开始开发 Ipython。IPython是一种用于多种编程语言的交互式计算的命令 shell,最初是为 Python 开发的。

考虑 IPython 提供的以下功能 -

  • 交互式 shell(终端和基于 Qt)。

  • 基于浏览器的笔记本,支持代码、文本、数学表达式、内联图和其他媒体。

  • 支持交互式数据可视化和 GUI 工具包的使用。

  • 灵活的、可嵌入的解释器可以加载到自己的项目中。

2014 年,Fernando Pérez 宣布了一个 IPython 的衍生项目,名为 Project Jupyter。IPython 将继续作为 Python shell 和 Jupyter 内核存在,而 IPython 的笔记本和其他与语言无关的部分将转移到 Jupyter 名称下。Jupyter 添加了对 Julia、R、Haskell 和 Ruby 的支持。

要启动 Jupyter Notebook,请打开 Anaconda navigator(Anaconda 中包含的桌面图形用户界面,允许您启动应用程序并轻松管理 Conda 包、环境和通道,而无需使用命令行命令)。

蟒蛇导航器

导航器显示发行版中已安装的组件。

Anaconda 导航器根

从导航器启动 Jupyter Notebook -

Jupyter笔记本

您将看到该应用程序在 Web 浏览器中打开,地址如下:http://localhost:8888。

命令提示符

您可能想从制作一个新笔记本开始。您可以通过单击“文件选项卡”中的“新建按钮”轻松完成此操作。您会看到可以选择创建常规文本文件、文件夹和终端。最后,您还将看到制作 Python 3 笔记本的选项。

Python 3 笔记本

Matplotlib - Pyplot API

浏览器的新选项卡中将显示一个带有.ipynb扩展名(代表 IPython 笔记本)的新未命名笔记本。

pyplot API

matplotlib.pyplot是命令样式函数的集合,使 Matplotlib 像 MATLAB 一样工作。每个 Pyplot 函数都会对图形进行一些更改。例如,函数创建一个图形、图形中的绘图区域、在绘图区域中绘制一些线条、用标签装饰绘图等。

地块类型

先生编号 功能说明
1

酒吧

绘制条形图。

2

巴尔

绘制水平条形图。

3

箱形图

制作一个盒须图。

4

历史

绘制直方图。

5

直方图

绘制二维直方图。

6

馅饼

绘制饼图。

7

Plotly

在轴上绘制线条和/或标记。

8

极性

制作极坐标图..

9

分散

绘制 x 与 y 的散点图。

10

堆栈图

绘制堆积面积图。

11

创建一个茎图。

12

制作一个步骤图。

13

颤动

绘制二维箭头场。

图像功能

先生编号 功能说明
1

读到

将图像从文件读取到数组中。

2

即时保存

将数组保存为图像文件。

3

映秀

在轴上显示图像。

轴功能

先生编号 功能说明
1

将轴添加到图中。

2

文本

将文本添加到轴。

3

标题

设置当前轴的标题。

4

X标签

设置当前轴的x轴标签。

5

西里姆

获取或设置当前轴的 x 限制。

6

X尺度

7

X刻度

获取或设置当前刻度位置和标签的 x 限制。

8

标签

设置当前轴的y轴标签。

9

伊利姆

获取或设置当前轴的 y 限制。

10

尺度

设置 y 轴的缩放比例。

11

伊克斯

获取或设置当前刻度位置和标签的 y 限制。

图形功能

先生编号 功能说明
1

图文

向图中添加文本。

2

数字

创建一个新图形。

3

展示

显示一个数字。

4

保存无花果

保存当前图形。

5

关闭

关闭图形窗口。

Matplotlib - 简单绘图

在本章中,我们将学习如何使用 Matplotlib 创建简单的绘图。

现在,我们将在 Matplotlib 中显示以弧度表示的角度与正弦值的简单线图。首先,导入 Matplotlib 包中的 Pyplot 模块,按照约定使用别名 plt。

import matplotlib.pyplot as plt

接下来我们需要一组数字来绘制。NumPy 库中定义了各种数组函数,并使用 np 别名导入。

import numpy as np

现在,我们使用 NumPy 库中的 arange() 函数获取角度在 0 到 2π 之间的 ndarray 对象。

x = np.arange(0, math.pi*2, 0.05)

ndarray 对象充当图表 x 轴上的值。要在 y 轴上显示的 x 角度的相应正弦值通过以下语句获得 -

y = np.sin(x)

使用plot() 函数绘制两个数组的值。

plt.plot(x,y)

您可以设置绘图标题以及 x 轴和 y 轴的标签。

You can set the plot title, and labels for x and y axes.
plt.xlabel("angle")
plt.ylabel("sine")
plt.title('sine wave')

绘图查看器窗口由 show() 函数调用 -

plt.show()

完整的程序如下 -

from matplotlib import pyplot as plt
import numpy as np
import math #needed for definition of pi
x = np.arange(0, math.pi*2, 0.05)
y = np.sin(x)
plt.plot(x,y)
plt.xlabel("angle")
plt.ylabel("sine")
plt.title('sine wave')
plt.show()

当执行上面的代码行时,将显示下图 -

简单的Plotly

现在,将 Jupyter Notebook 与 Matplotlib 结合使用。

如前所述,从 Anaconda 导航器或命令行启动 Jupyter 笔记本。在输入单元格中,输入 Pyplot 和 NumPy 的导入语句 -

from matplotlib import pyplot as plt
import numpy as np

要在笔记本本身内部(而不是在单独的查看器中)显示绘图输出,请输入以下魔术语句 -

%matplotlib inline

获取 x 作为包含 0 到 2π 之间弧度的角度的 ndarray 对象,以及 y 作为每个角度的正弦值 -

import math
x = np.arange(0, math.pi*2, 0.05)
y = np.sin(x)

设置 x 和 y 轴的标签以及绘图标题 -

plt.xlabel("angle")
plt.ylabel("sine")
plt.title('sine wave')

最后执行plot()函数在笔记本中生成正弦波显示(无需运行show()函数) -

plt.plot(x,y)

执行最后一行代码后,将显示以下输出 -

最后一行代码

Matplotlib - PyLab 模块

PyLab 是 Matplotlib 面向对象绘图库的程序接口。Matplotlib 是整个包;matplotlib.pyplot 是 Matplotlib 中的一个模块;PyLab 是与 Matplotlib 一起安装的模块。

PyLab 是一个便捷模块,可在单个名称空间中批量导入 matplotlib.pyplot(用于绘图)和 NumPy(用于数学和处理数组)。尽管许多示例使用 PyLab,但不再推荐。

基本绘图

绘制曲线是使用plot 命令完成的。它需要一对相同长度的数组(或序列) -

from numpy import *
from pylab import *
x = linspace(-3, 3, 30)
y = x**2
plot(x, y)
show()

上面的代码行生成以下输出 -

基本绘图

要绘制符号而不是线条,请提供额外的字符串参数。

符号 - , –, -., , . , , , o , ^ , v , < , > , s , + , x , D , d , 1 , 2 , 3 , 4 , h , H , p , | , _
颜色 b、g、r、c、m、y、k、w

现在,考虑执行以下代码 -

from pylab import *
x = linspace(-3, 3, 30)
y = x**2
plot(x, y, 'r.')
show()

它绘制红点,如下所示 -

附加字符串参数

绘图可以重叠。只需使用多个绘图命令即可。使用 clf() 清除绘图。

from pylab import *
plot(x, sin(x))
plot(x, cos(x), 'r-')
plot(x, -sin(x), 'g--')
show()

上面的代码行生成以下输出 -

多个绘图命令

Matplotlib - 面向对象的接口

虽然使用matplotlib.pyplot模块很容易快速生成绘图,但建议使用面向对象的方法,因为它可以更好地控制和自定义绘图。大多数函数也可在 matplotlib.axes.Axes类中使用。

使用更正式的面向对象方法背后的主要思想是创建图形对象,然后调用该对象的方法或属性。这种方法有助于更好地处理具有多个绘图的画布。

在面向对象的界面中,Pyplot 仅用于少数功能,例如图形创建,用户显式创建并跟踪图形和轴对象。在这一级别,用户使用 Pyplot 创建图形,并通过这些图形可以创建一个或多个轴对象。这些轴对象随后用于大多数绘图操作。

首先,我们创建一个提供空画布的图形实例。

fig = plt.figure()

现在将轴添加到图中。add_axes ()方法需要一个包含 4 个元素的列表对象,分别对应于图形的左、下、宽和高。每个数字必须介于 0 和 1 之间 -

ax=fig.add_axes([0,0,1,1])

设置 x 轴和 y 轴以及标题的标签 -

ax.set_title("sine wave")
ax.set_xlabel('angle')
ax.set_ylabel('sine')

调用坐标区对象的plot()方法。

ax.plot(x,y)

如果您使用 Jupyter Notebook,则必须发出 %matplotlib inline 指令;pyplot 模块的 otherwistshow() 函数显示绘图。

考虑执行以下代码 -

from matplotlib import pyplot as plt
import numpy as np
import math
x = np.arange(0, math.pi*2, 0.05)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.plot(x,y)
ax.set_title("sine wave")
ax.set_xlabel('angle')
ax.set_ylabel('sine')
plt.show()

输出

上面的代码行生成以下输出 -

添加轴方法

在 Jupyter 笔记本中运行相同的代码时显示的输出如下所示 -

Jupyter 笔记本输出

Matplotlib - 图形类

matplotlib.figure模块包含Figure 类。它是所有绘图元素的顶级容器。通过从 pyplot 模块调用figure()函数来实例化Figure对象-

fig = plt.figure()

下表显示了附加参数 -

无花果 (宽度,高度)以英寸为单位的元组
深度 每英寸点数
面色 图贴面色
边缘颜色 图块边缘颜色
行宽 边缘线宽度

Matplotlib - 轴类

轴对象是具有数据空间的图像区域。一个给定的图形可以包含多个 Axes,但给定的 Axes 对象只能在一个图形中。Axes 包含两个(如果是 3D,则为三个)Axis 对象。Axes 类及其成员函数是使用 OO 接口的主要入口点。

通过调用 add_axes() 方法将 Axes 对象添加到图中。它返回坐标区对象,并在位置 rect [左、下、宽、高] 处添加一个坐标区,其中所有数量均以图形宽度和高度的分数形式表示。

范围

以下是 Axes 类的参数 -

  • rect - [左、下、宽、高] 数量的 4 长度序列。

ax=fig.add_axes([0,0,1,1])

轴类的以下成员函数添加不同的元素到绘图 -

传奇

axes 类的legend ()方法向绘图添加图例。它需要三个参数 -

ax.legend(handles, labels, loc)

其中 labels 是字符串序列,并处理 Line2D 或 Patch 实例序列。loc 可以是指定图例位置的字符串或整数。

位置字符串 位置代码
最好的 0
右上方 1
左上 2
左下角 3
右下 4
正确的 5
中左 6
中右 7
下中心 8
上中心 9
中心 10

轴.plot()

这是axes 类的基本方法,它将一个数组的值与另一个数组的值绘制为线条或标记。plot() 方法可以有一个可选的格式字符串参数来指定线条和标记的颜色、样式和大小。

颜色代码

特点 颜色
'b' 蓝色的
'G' 绿色的
'r' 红色的
'b' 蓝色的
'C' 青色
'我' 品红
'你' 黄色的
'k' 黑色的
'b' 蓝色的
'w' 白色的

标记代码

特点 描述
'.' 点标记
'o' 圆形标记
'X' X标记
'D' 钻石标记
'H' 六角标记
方形标记
'+' 加号标记

线条样式

特点 描述
'-' 实线
'——' 虚线
'-。' 点划线
':' 虚线
'H' 六角标记

下面的例子以线图的形式显示了电视和智能手机的广告费用和销售数据。代表电视的线是带有黄色和方形标记的实线,而智能手机线是带有绿色和圆形标记的虚线。

import matplotlib.pyplot as plt
y = [1, 4, 9, 16, 25,36,49, 64]
x1 = [1, 16, 30, 42,55, 68, 77,88]
x2 = [1,6,12,18,28, 40, 52, 65]
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
l1 = ax.plot(x1,y,'ys-') # solid line with yellow colour and square marker
l2 = ax.plot(x2,y,'go--') # dash line with green colour and circle marker
ax.legend(labels = ('tv', 'Smartphone'), loc = 'lower right') # legend placed at lower right
ax.set_title("Advertisement effect on sales")
ax.set_xlabel('medium')
ax.set_ylabel('sales')
plt.show()

当执行上面的代码行时,它会产生以下图 -

广告效果

Matplotlib - 多图

在本章中,我们将学习如何在同一画布上创建多个子图。

subplot ()函数返回给定网格位置的坐标区对象。该函数的调用签名是 -

plt.subplot(subplot(nrows, ncols, index)

在当前图中,该函数创建并返回一个 Axes 对象,位于 nrows x ncolsaxes 网格的位置索引处。索引从 1 到 nrows * ncols,按行主序递增。如果 nrows、ncols 和索引都小于 10。索引也可以以单个、串联、三位数的形式给出。

例如, subplot(2, 3, 3) 和 subplot(233) 都在当前图窗的右上角创建一个轴,占据图窗高度的一半和图窗宽度的三分之一。

创建子图将删除与其重叠但超出共享边界的任何预先存在的子图。

import matplotlib.pyplot as plt
# plot a line, implicitly creating a subplot(111)
plt.plot([1,2,3])
# now create a subplot which represents the top plot of a grid with 2 rows and 1 column.
#Since this subplot will overlap the first, the plot (and its axes) previously 
created, will be removed
plt.subplot(211)
plt.plot(range(12))
plt.subplot(212, facecolor='y') # creates 2nd subplot with yellow background
plt.plot(range(12))

上面的代码行生成以下输出 -

多图

图类的 add_subplot() 函数不会覆盖现有图 -

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot([1,2,3])
ax2 = fig.add_subplot(221, facecolor='y')
ax2.plot([1,2,3])

当执行上面的代码行时,它会生成以下输出 -

新增现货功能

您可以通过在同一图形画布中添加另一个坐标区对象来在同一图形中添加插入图。

import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(0, math.pi*2, 0.05)
fig=plt.figure()
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # main axes
axes2 = fig.add_axes([0.55, 0.55, 0.3, 0.3]) # inset axes
y = np.sin(x)
axes1.plot(x, y, 'b')
axes2.plot(x,np.cos(x),'r')
axes1.set_title('sine')
axes2.set_title("cosine")
plt.show()

执行上述代码行后,将生成以下输出 -

插入图

Matplotlib - Subplots() 函数

Matplotlib 的spyplot API 有一个名为 subplots() 的便捷函数,它充当实用程序包装器,有助于在一次调用中创建子图的常见布局,包括封闭的图形对象。

Plt.subplots(nrows, ncols)

该函数的两个整数参数指定子图网格的行数和列数。该函数返回一个图形对象和一个包含等于 nrows*ncols 的轴对象的元组。每个轴对象都可以通过其索引进行访问。在这里,我们创建一个 2 行 x 2 列的子图,并在每个子图中显示 4 个不同的图。

import matplotlib.pyplot as plt
fig,a =  plt.subplots(2,2)
import numpy as np
x = np.arange(1,5)
a[0][0].plot(x,x*x)
a[0][0].set_title('square')
a[0][1].plot(x,np.sqrt(x))
a[0][1].set_title('square root')
a[1][0].plot(x,np.exp(x))
a[1][0].set_title('exp')
a[1][1].plot(x,np.log10(x))
a[1][1].set_title('log')
plt.show()

上面的代码行生成以下输出 -

子图函数

Matplotlib - Subplot2grid() 函数

此函数为在网格的特定位置创建轴对象提供了更大的灵活性。它还允许轴对象跨越多行或多列。

Plt.subplot2grid(shape, location, rowspan, colspan)

在以下示例中,图形对象的 3X3 网格填充了行和列跨度大小不同的轴对象,每个对象显示不同的图。

import matplotlib.pyplot as plt
a1 = plt.subplot2grid((3,3),(0,0),colspan = 2)
a2 = plt.subplot2grid((3,3),(0,2), rowspan = 3)
a3 = plt.subplot2grid((3,3),(1,0),rowspan = 2, colspan = 2)
import numpy as np
x = np.arange(1,10)
a2.plot(x, x*x)
a2.set_title('square')
a1.plot(x, np.exp(x))
a1.set_title('exp')
a3.plot(x, np.log(x))
a3.set_title('log')
plt.tight_layout()
plt.show()

执行上述行代码后,将生成以下输出 -

Subplot2grid 函数

Matplotlib - 网格

轴对象的 grid() 函数将图形内网格的可见性设置为打开或关闭。您还可以显示网格的主要/次要(或两者)刻度。此外,可以在 grid() 函数中设置颜色、线型和线宽属性。

import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(1,3, figsize = (12,4))
x = np.arange(1,11)
axes[0].plot(x, x**3, 'g',lw=2)
axes[0].grid(True)
axes[0].set_title('default grid')
axes[1].plot(x, np.exp(x), 'r')
axes[1].grid(color='b', ls = '-.', lw = 0.25)
axes[1].set_title('custom grid')
axes[2].plot(x,x)
axes[2].set_title('no grid')
fig.tight_layout()
plt.show()
网格

Matplotlib - 格式化轴

有时,一个或几个点比大量数据大得多。在这种情况下,轴的刻度需要设置为对数而不是正常刻度。这是对数标度。在 Matplotlib 中,可以通过将坐标区对象的 xscale 或 vscale 属性设置为“log”来实现。

有时还需要在轴编号和轴标签之间显示一些额外的距离。任一轴(x 或 y 或两者)的 labelpad 属性可以设置为所需的值。

上述两个功能都通过以下示例进行了演示。右侧的子图具有对数刻度,左侧的子图的 x 轴距离更远。

import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(1, 2, figsize=(10,4))
x = np.arange(1,5)
axes[0].plot( x, np.exp(x))
axes[0].plot(x,x**2)
axes[0].set_title("Normal scale")
axes[1].plot (x, np.exp(x))
axes[1].plot(x, x**2)
axes[1].set_yscale("log")
axes[1].set_title("Logarithmic scale (y)")
axes[0].set_xlabel("x axis")
axes[0].set_ylabel("y axis")
axes[0].xaxis.labelpad = 10
axes[1].set_xlabel("x axis")
axes[1].set_ylabel("y axis")
plt.show()
设置轴格式

轴脊是连接划分绘图区域边界的轴刻度线的线。轴对象的脊柱位于顶部、底部、左侧和右侧。

每个书脊都可以通过指定颜色和宽度来格式化。如果任何边缘的颜色设置为无,则可以使其不可见。

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.spines['bottom'].set_color('blue')
ax.spines['left'].set_color('red')
ax.spines['left'].set_linewidth(2)
ax.spines['right'].set_color(None)
ax.spines['top'].set_color(None)
ax.plot([1,2,3,4,5])
plt.show()
轴刺

Matplotlib - 设置限制

Matplotlib 自动得出要沿绘图的 x、y(如果是 3D 绘图,则为 z 轴)轴显示的变量的最小值和最大值。但是,可以使用set_xlim()set_ylim()函数显式设置限制。

在下图中,显示了 x 轴和 y 轴的自动缩放限制 -

import matplotlib.pyplot as plt
fig = plt.figure()
a1 = fig.add_axes([0,0,1,1])
import numpy as np
x = np.arange(1,10)
a1.plot(x, np.exp(x))
a1.set_title('exp')
plt.show()
设定限制

现在我们将 x 轴的限制格式设置为(0 到 10),将 y 轴的限制格式设置为(0 到 10000) -

import matplotlib.pyplot as plt
fig = plt.figure()
a1 = fig.add_axes([0,0,1,1])
import numpy as np
x = np.arange(1,10)
a1.plot(x, np.exp(x),'r')
a1.set_title('exp')
a1.set_ylim(0,10000)
a1.set_xlim(0,10)
plt.show()
格式化限制

Matplotlib - 设置刻度和刻度标签

刻度是表示轴上数据点的标记。到目前为止,在我们之前的所有示例中,Matplotlib 已经自动接管了轴上间隔点的任务。Matplotlib 的默认刻度定位器和格式化程序被设计为在许多常见情况下通常足够。可以明确提及刻度的位置和标签以满足特定要求。

xticks ()yticks()函数采用列表对象作为参数。列表中的元素表示相应操作上将显示刻度的位置。

ax.set_xticks([2,4,6,8,10])

此方法将用刻度标记给定位置的数据点。

同样,刻度线对应的标签可以分别通过set_xlabels()set_ylabels()函数设置。

ax.set_xlabels([‘two’, ‘four’,’six’, ‘eight’, ‘ten’])

这将在 x 轴标记下方显示文本标签。

以下示例演示了刻度线和标签的使用。

import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(0, math.pi*2, 0.05)
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # main axes
y = np.sin(x)
ax.plot(x, y)
ax.set_xlabel(‘angle’)
ax.set_title('sine')
ax.set_xticks([0,2,4,6])
ax.set_xticklabels(['zero','two','four','six'])
ax.set_yticks([-1,0,1])
plt.show()
勾号和标签

Matplotlib - 双轴

在图中拥有双 x 或 y 轴被认为是有用的。此外,当一起绘制不同单位的曲线时。Matplotlib 通过 twinx 和 twiny 函数支持这一点。

在下面的示例中,该图具有双 y 轴,一个显示 exp(x),另一个显示 log(x) -

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
a1 = fig.add_axes([0,0,1,1])
x = np.arange(1,11)
a1.plot(x,np.exp(x))
a1.set_ylabel('exp')
a2 = a1.twinx()
a2.plot(x, np.log(x),'ro-')
a2.set_ylabel('log')
fig.legend(labels = ('exp','log'),loc='upper left')
plt.show()
双轴

Matplotlib - 条形图

条形图或条形图是用矩形条显示分类数据的图表或图形,矩形条的高度或长度与其所表示的值成比例。条形图可以垂直或水平绘制。

条形图显示离散类别之间的比较。图表的一个轴显示正在比较的特定类别,另一轴表示测量值。

Matplotlib API 提供了bar()函数,可用于 MATLAB 风格以及面向对象的 API。与坐标区对象一起使用的 bar() 函数的签名如下 -

ax.bar(x, height, width, bottom, align)

该函数使用大小为 (x −width = 2; x + width=2;bottom;bottom + height) 的边界矩形绘制条形图。

该函数的参数是 -

X 表示条形 x 坐标的标量序列。对齐控制 x 是条形中心(默认)还是左边缘。
高度 表示条形高度的标量或标量序列。
宽度 标量或类似数组,可选。条形的宽度默认为 0.8
底部 标量或类似数组,可选。条形的 y 坐标默认为“无”。
对齐 {'center', 'edge'},可选,默认'center'

该函数返回包含所有条形图的 Matplotlib 容器对象。

以下是 Matplotlib 条形图的简单示例。它显示了就读学院提供的各种课程的学生人数。

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
students = [23,17,35,29,12]
ax.bar(langs,students)
plt.show()
Matplotlib 条形图

当比较多个数量和更改一个变量时,我们可能需要一个条形图,其中一种颜色的条形代表一个数量值。

我们可以通过调整条形的厚度和位置来绘制多个条形图。数据变量包含三个系列,每组四个值。以下脚本将显示三个由四个条形组成的条形图。条形的厚度为 0.25 个单位。每个条形图将比前一个移动 0.25 个单位。该数据对象是一个多重字典,包含过去四年中通过工程学院三个分校的学生人数。

import numpy as np
import matplotlib.pyplot as plt
data = [[30, 25, 50, 20],
[40, 23, 51, 17],
[35, 22, 45, 19]]
X = np.arange(4)
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.bar(X + 0.00, data[0], color = 'b', width = 0.25)
ax.bar(X + 0.25, data[1], color = 'g', width = 0.25)
ax.bar(X + 0.50, data[2], color = 'r', width = 0.25)
多个条形图

堆叠条形图将代表不同组的条形堆叠在一起。结果条的高度显示各组的组合结果。

pyplot.bar()函数的可选底部参数允许您指定条形的起始值。不是从零跑到某个值,而是从底部跑到该值。第一次调用 pyplot.bar() 绘制蓝色条。第二次调用 pyplot.bar() 绘制红色条,蓝色条的底部位于红色条的顶部。

import numpy as np
import matplotlib.pyplot as plt
N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
ind = np.arange(N) # the x locations for the groups
width = 0.35
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.bar(ind, menMeans, width, color='r')
ax.bar(ind, womenMeans, width,bottom=menMeans, color='b')
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
ax.set_yticks(np.arange(0, 81, 10))
ax.legend(labels=['Men', 'Women'])
plt.show()
分数

Matplotlib - 直方图

直方图是数值数据分布的准确表示。它是连续变量概率分布的估计。它是一种条形图。

要构建直方图,请按照以下步骤操作 -

  • 对值的范围进行分箱。
  • 将整个值范围划分为一系列区间。
  • 计算每个区间内有多少个值。

bin 通常被指定为变量的连续、不重叠的间隔。

matplotlib.pyplot.hist ()函数绘制直方图。它计算并绘制 x 的直方图。

参数

下表列出了直方图的参数 -

X 数组或数组序列
垃圾箱 整数或序列或'auto',可选
可选参数
范围 垃圾箱的下限和上限范围。
密度 如果为 True,则返回元组的第一个元素将是标准化后形成概率密度的计数
累计 如果为 True,则计算直方图,其中每个箱给出该箱中的计数以及较小值的所有箱。
组织型 要绘制的直方图的类型。默认为“酒吧”
  • “bar”是传统的条形直方图。如果给出多个数据,则条形图并排排列。
  • “barstacked”是一个条形直方图,其中多个数据相互堆叠。
  • 'step' 生成默认情况下未填充的线图。
  • 'stepfilled' 生成默认填充的线图。

以下示例绘制了班级学生获得的分数的直方图。定义了四个容器:0-25、26-50、51-75 和 76-100。直方图显示了落在该范围内的学生人数。

from matplotlib import pyplot as plt
import numpy as np
fig,ax = plt.subplots(1,1)
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
ax.hist(a, bins = [0,25,50,75,100])
ax.set_title("histogram of result")
ax.set_xticks([0,25,50,75,100])
ax.set_xlabel('marks')
ax.set_ylabel('no. of students')
plt.show()

该图如下所示 -

直方图

Matplotlib - 饼图

饼图只能显示一系列数据。饼图显示一个数据系列中项目的大小(称为楔形),与项目总和成正比。饼图中的数据点显示为整个饼图的百分比。

Matplotlib API 有一个pie()函数,可以生成表示数组中数据的饼图。每个楔形的分数面积由x/sum(x)给出。如果 sum(x)< 1,则 x 的值直接给出分数面积,并且数组将不会被归一化。由此产生的饼图将有一个大小为 1 - sum(x) 的空楔形。

如果图形和轴是方形的,或者轴的长宽相等,则饼图看起来最好。

参数

下表列出了饼图的参数 -

X 类似数组。楔子尺寸。
标签 列表。为每个楔形提供标签的字符串序列。
颜色 饼图将循环通过的 matplotlibcolorargs 序列。如果没有,将使用当前活动周期中的颜色。
奥托普克特 字符串,用于用数值标记楔形。标签将放置在楔子内。格式字符串将为 fmt%pct。

以下代码使用pie()函数来显示注册各种计算机语言课程的学生列表的饼图。借助设置为 %1.2f% 的autopct参数,比例百分比显示在相应的楔形内。

from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.axis('equal')
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
students = [23,17,35,29,12]
ax.pie(students, labels = langs,autopct='%1.2f%%')
plt.show()
饼形图

Matplotlib - 散点图

散点图用于在水平轴和垂直轴上绘制数据点,试图显示一个变量受另一个变量影响的程度。数据表中的每一行都由一个标记表示,其位置取决于 X 轴和 Y 轴上设置的列中的值。可以设置第三个变量来对应标记的颜色或大小,从而为绘图添加另一个维度。

下面的脚本用两种不同的颜色绘制了男孩和女孩的成绩范围与成绩的散点图。

import matplotlib.pyplot as plt
girls_grades = [89, 90, 70, 89, 100, 80, 90, 100, 80, 34]
boys_grades = [30, 29, 49, 48, 100, 48, 38, 45, 20, 30]
grades_range = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
fig=plt.figure()
ax=fig.add_axes([0,0,1,1])
ax.scatter(grades_range, girls_grades, color='r')
ax.scatter(grades_range, boys_grades, color='b')
ax.set_xlabel('Grades Range')
ax.set_ylabel('Grades Scored')
ax.set_title('scatter plot')
plt.show()
分级评分

Matplotlib - 等值线图

等值线图(有时称为水平图)是在二维平面上显示三维表面的一种方法。它将两个预测变量 XY 绘制在 y 轴上,将响应变量 Z 绘制为等值线。这些轮廓有时称为 z 切片或 iso 响应值。

如果您想要查看值 Z 作为两个输入 X 和 Y 的函数如何变化(例如 Z = f(X,Y)),那么等高线图是合适的。两个变量函数的等高线或等值线是函数具有恒定值的曲线。

自变量 x 和 y 通常仅限于称为 meshgrid 的规则网格。numpy.meshgrid 使用 x 值数组和 y 值数组创建一个矩形网格。

Matplotlib API 包含contour() 和contourf() 函数,分别绘制等高线和填充等高线。这两个函数都需要三个参数 x、y 和 z。

import numpy as np
import matplotlib.pyplot as plt
xlist = np.linspace(-3.0, 3.0, 100)
ylist = np.linspace(-3.0, 3.0, 100)
X, Y = np.meshgrid(xlist, ylist)
Z = np.sqrt(X**2 + Y**2)
fig,ax=plt.subplots(1,1)
cp = ax.contourf(X, Y, Z)
fig.colorbar(cp) # Add a colorbar to a plot
ax.set_title('Filled Contours Plot')
#ax.set_xlabel('x (cm)')
ax.set_ylabel('y (cm)')
plt.show()
填充颜​​色图

Matplotlib - 箭袋图

颤动图将速度矢量显示为箭头,其分量 (u,v) 位于点 (x,y)。

quiver(x,y,u,v)

上述命令在 x 和 y 中每对相应元素中指定的坐标处将向量绘制为箭头。

参数

下表列出了 Quiver 图的不同参数 -

X 一维或二维数组、序列。箭头位置的 x 坐标
y 一维或二维数组、序列。箭头位置的 y 坐标
一维或二维数组、序列。箭头向量的 x 分量
v 一维或二维数组、序列。箭头向量的 y 分量
C 一维或二维数组、序列。箭头颜色

下面的代码绘制了一个简单的箭袋图 -

import matplotlib.pyplot as plt
import numpy as np
x,y = np.meshgrid(np.arange(-2, 2, .2), np.arange(-2, 2, .25))
z = x*np.exp(-x**2 - y**2)
v, u = np.gradient(z, .2, .2)
fig, ax = plt.subplots()
q = ax.quiver(x,y,u,v)
plt.show()
更快的Plotly

Matplotlib - 箱线图

箱形图也称为须状图,显示一组数据的摘要,其中包含最小值、第一四分位数、中位数、第三四分位数和最大值。在箱线图中,我们从第一个四分位数到第三个四分位数绘制一个方框。一条垂直线穿过中间的盒子。须线从每个四分位数到最小值或最大值。

箱形图

让我们为箱线图创建数据。我们使用numpy.random.normal()函数来创建假数据。它需要三个参数:正态分布的平均值和标准差,以及所需值的数量。

np.random.seed(10)
collectn_1 = np.random.normal(100, 10, 200)
collectn_2 = np.random.normal(80, 30, 200)
collectn_3 = np.random.normal(90, 20, 200)
collectn_4 = np.random.normal(70, 25, 200)

我们上面创建的数组列表是创建箱线图所需的唯一输入。使用data_to_plot代码行,我们可以使用以下代码创建箱线图 -

fig = plt.figure()
# Create an axes instance
ax = fig.add_axes([0,0,1,1])
# Create the boxplot
bp = ax.boxplot(data_to_plot)
plt.show()

上面的代码行将生成以下输出 -

代码行

Matplotlib - 小提琴图

小提琴图与箱线图类似,不同之处在于它们还显示不同值下数据的概率密度。这些图包括数据中位数的标记和指示四分位数范围的框,如标准箱线图中所示。覆盖在该箱形图上的是核密度估计。与箱线图类似,小提琴图用于表示不同“类别”之间的变量分布(或样本分布)的比较。

小提琴图比普通箱线图提供更多信息。事实上,箱线图仅显示平均值/中位数和四分位距等汇总统计数据,而小提琴图则显示数据的完整分布。

将 matplotlib.pyplot 导入为 plt
将 numpy 导入为 np

np.随机.种子(10)
collectn_1 = np.random.normal(100, 10, 200)
collectn_2 = np.random.normal(80, 30, 200)
collectn_3 = np.random.normal(90, 20, 200)
collectn_4 = np.random.normal(70, 25, 200)

## 将这些不同的集合组合成一个列表
data_to_plot = [collectn_1、collectn_2、collectn_3、collectn_4]

# 创建图形实例
图 = plt.figure()

# 创建一个坐标轴实例
ax = Fig.add_axes([0,0,1,1])

# 创建箱线图
bp = ax.violinplot(data_to_plot)
plt.show()
小提琴Plotly

Matplotlib - 三维绘图

尽管 Matplotlib 最初设计时只考虑了二维绘图,但在后来的版本中,在 Matplotlib 的二维显示之上构建了一些三维绘图实用程序,以提供一组用于三维数据可视化的工具。通过导入Matplotlib 包中包含的mplot3d 工具包来启用三维绘图。

可以通过将关键字projection='3d' 传递给任何法线轴创建例程来创建三维轴。

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
z = np.linspace(0, 1, 100)
x = z * np.sin(20 * z)
y = z * np.cos(20 * z)
ax.plot3D(x, y, z, 'gray')
ax.set_title('3D line plot')
plt.show()

我们现在可以绘制各种三维绘图类型。最基本的三维图是由 (x, y, z) 三元组创建的3D 线图。这可以使用 ax.plot3D 函数创建。

三维绘图

3D 散点图是使用ax.scatter3D函数生成的。

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
z = np.linspace(0, 1, 100)
x = z * np.sin(20 * z)
y = z * np.cos(20 * z)
c = x + y
ax.scatter(x, y, z, c=c)
ax.set_title('3d Scatter plot')
plt.show()
3D 散点图

Matplotlib - 3D 等高线图

ax.contour3D ()函数创建三维等高线图。它要求所有输入数据均采用二维规则网格的形式,并在每个点评估 Z 数据。在这里,我们将展示三维正弦函数的三维等值线图。

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
   return np.sin(np.sqrt(x ** 2 + y ** 2))
	
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('3D contour')
plt.show()
3D轮廓

Matplotlib - 3D 线框图

线框图采用值网格并将其投影到指定的三维表面上,并且可以使生成的三维形式非常容易可视化。plot_wireframe ()函数用于此目的 -

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
   return np.sin(np.sqrt(x ** 2 + y ** 2))
	
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='black')
ax.set_title('wireframe')
plt.show()

上面的代码行将生成以下输出 -

线框

Matplotlib - 3D 曲面图

曲面图显示指定因变量 (Y) 和两个自变量(X 和 Z)之间的函数关系。该图是等高线图的姊妹图。曲面图类似于线框图,但线框的每个面都是填充的多边形。这可以帮助感知可视化表面的拓扑结构。plot_surface ()函数 x、y 和 z 作为参数。

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
x = np.outer(np.linspace(-2, 2, 30), np.ones(30))
y = x.copy().T # transpose
z = np.cos(x ** 2 + y ** 2)

fig = plt.figure()
ax = plt.axes(projection='3d')

ax.plot_surface(x, y, z,cmap='viridis', edgecolor='none')
ax.set_title('Surface plot')
plt.show()

上面的代码行将生成以下输出 -

曲面图

Matplotlib - 处理文本

Matplotlib 具有广泛的文本支持,包括对数学表达式的支持、对光栅和矢量输出的TrueType支持、具有任意旋转的换行符分隔文本以及 unicode 支持。Matplotlib 包含自己的 matplotlib.font_manager,它实现了跨平台、符合 W3C 的字体查找算法。

用户对文本属性(字体大小、字体粗细、文本位置和颜色等)有很大的控制权。Matplotlib 实现了大量的 TeX 数学符号和命令。

以下命令列表用于在 Pyplot 界面中创建文本 -

文本 在轴的任意位置添加文本。
注释 在轴的任意位置添加带有可选箭头的注释。
标签 将标签添加到 Axes 的 x 轴。
标签 将标签添加到 Axes 的 y 轴。
标题 向轴添加标题。
图文 在图形的任意位置添加文本。
副标题 为图添加标题。

所有这些函数都会创建并返回一个matplotlib.text.Text()实例。

以下脚本演示了上述一些功能的使用 -

import matplotlib.pyplot as plt
fig = plt.figure()

ax = fig.add_axes([0,0,1,1])

ax.set_title('axes title')
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
ax.text(3, 8, 'boxed italics text in data coords', style='italic', 
bbox = {'facecolor': 'red'})
ax.text(2, 6, r'an equation: $E = mc^2$', fontsize = 15)
ax.text(4, 0.05, 'colored text in axes coords',
verticalalignment = 'bottom', color = 'green', fontsize = 15)
ax.plot([2], [1], 'o')
ax.annotate('annotate', xy = (2, 1), xytext = (3, 4),
arrowprops = dict(facecolor = 'black', shrink = 0.05))
ax.axis([0, 10, 0, 10])
plt.show()

上面的代码行将生成以下输出 -

处理文本

Matplotlib - 数学表达式

您可以在任何 Matplotlib 文本字符串中使用 TeXmarkup 子集,方法是将其放置在一对美元符号 ($) 内。

# math text
plt.title(r'$\alpha > \beta$')

要制作下标和上标,请使用“_”和“^”符号 -

r'$\alpha_i> \beta_i$'

import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)

plt.plot(t,s)
plt.title(r'$\alpha_i> \beta_i$', fontsize=20)

plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize = 20)
plt.text(0.1, -0.5, r'$\sqrt{2}$', fontsize=10)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()

上面的代码行将生成以下输出 -

数学表达式

Matplotlib - 处理图像

Matplotlib 包中的图像模块提供了加载、重新缩放和显示图像所需的功能。

Pillow 库支持加载图像数据。Matplotlib 本身仅支持 PNG 图像。如果本机读取失败,下面显示的命令将退回到 Pillow。

本示例中使用的图像是 PNG 文件,但请记住您自己的数据的 Pillow 要求。imread ()函数用于读取float32 dtype 的ndarray对象中的图像数据。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
img = mpimg.imread('mtplogo.png')

假设当前工作目录中存在以下名为mtplogo.png的图像。

Matplotlib 图像

任何包含图像数据的数组都可以通过执行imsave()函数保存到磁盘文件中。这里通过将 origin 参数设置为较低来保存原始 png 文件的垂直翻转版本。

plt.imsave("logo.png", img, cmap = 'gray', origin = 'lower')

如果在任何图像查看器中打开,新图像将如下所示。

图片浏览器

要在 Matplotlib 查看器上绘制图像,请执行imshow()函数。

imgplot = plt.imshow(img)

Matplotlib - 变换

matplotlib 包构建在转换框架之上,可以轻松地在坐标系之间移动。可以使用四个坐标系。下表简要描述了这些系统 -

协调 变换对象 描述
数据 ax.transData

用户土地数据坐标系。由 xlim 和 ylim 控制

轴.transAxes

轴的坐标系。(0,0) 是轴的左下角,(1,1) 是轴的右上角。

数字 Fig.trans图

图形的坐标系。(0,0) 是图的左下角,(1,1) 是图的右上角

展示 没有任何

这是显示器的像素坐标系。(0,0) 是显示的左下角,(宽度, 高度) 是显示的右上角(以像素为单位)。

或者,可以使用(matplotlib.transforms.IdentityTransform())代替None。

考虑以下示例 -

axes.text(x,y,"my label") 

文本放置在数据点 (x,y) 的理论位置。因此我们会谈论“数据坐标”。

使用其他变换对象,可以控制放置。例如,如果要将上述测试放置在轴坐标系的中心,则执行以下代码行 -

axes.text(0.5, 0.5, "middle of graph", transform=axes.transAxes)

这些转换可用于任何类型的 Matplotlib 对象。ax.text的默认转换是ax.transData , fig.text的默认转换是Fig.transFigure。

将文本放置在坐标区中时,坐标区坐标系非常有用。您可能经常希望文本气泡位于固定位置;例如,在轴窗格的左上角,并在平移或缩放时保持该位置固定。