Matplotlib 快速指南



Matplotlib - 简介

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

Matplotlib 有一个名为 Pylab 的过程化接口,其设计类似于 MATLAB(MathWorks开发的一种专有编程语言)。Matplotlib 与 NumPy 可以被认为是 MATLAB 的开源等效项。

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

Matplotlib - 环境搭建

Matplotlib 及其依赖包以 wheel 包的形式存在于标准 Python 包存储库中,可以使用 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)
  • NumPy
  • setuptools
  • dateutil
  • pyparsing
  • libpng
  • pytz
  • FreeType
  • cycler
  • six

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

  • tk
  • PyQt4
  • PyQt5
  • pygtk
  • wxpython
  • pycairo
  • Tornado

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

  • _mpeg/avconv
  • ImageMagick
  • Pillow (>=2.0)
  • LaTeX 和 GhostScript(用于使用 LaTeX 渲染文本)。
  • LaTeX 和 GhostScript(用于使用 LaTeX 渲染文本)。

Matplotlib - Anaconda 发行版

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

Anaconda 发行版可从 https://anaconda.net.cn/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

安装是一个相当简单的基于向导的过程。您可以在将 Anaconda 添加到 PATH 变量和将 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 Notebook

Jupyter 是一个宽松的首字母缩写词,代表 Julia、Python 和 R。这些编程语言是 Jupyter 应用程序的最初目标语言,但如今,notebook 技术也支持许多其他语言。

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

考虑 IPython 提供的以下功能:

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

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

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

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

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

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

Anaconda Navigator

Navigator 显示发行版中安装的组件。

Anaconda Navigator Root

从 Navigator 启动 Jupyter Notebook:

Jupyter Notebook

您将看到应用程序在以下地址的 Web 浏览器中打开:https://127.0.0.1:8888。

Command Prompt

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

Python 3 Notebook

Matplotlib - Pyplot API

一个新的未命名 notebook,扩展名为 .ipynb(代表 IPython notebook),显示在浏览器的新选项卡中。

Pyplot API

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

绘图类型

序号 函数和描述
1

Bar

创建条形图。

2

Barh

创建水平条形图。

3

Boxplot

创建箱线图。

4

直方图

绘制直方图。

5

二维直方图

创建二维直方图。

6

饼图

绘制饼图。

7

线图

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

8

极坐标图

创建极坐标图。

9

散点图

创建x轴与y轴的散点图。

10

堆叠图

绘制堆叠区域图。

11

茎叶图

创建茎叶图。

12

阶梯图

创建阶梯图。

13

矢量图

绘制二维箭头场。

图像函数

序号 函数和描述
1

读取图像

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

2

保存图像

将数组保存为图像文件。

3

显示图像

在坐标系上显示图像。

坐标系函数

序号 函数和描述
1

坐标系

向图形添加坐标系。

2

文本

向坐标系添加文本。

3

标题

设置当前坐标系的标题。

4

X轴标签

设置当前坐标系的x轴标签。

5

X轴范围

获取或设置当前坐标系的x轴范围。

6

X轴刻度

.

7

X轴刻度

获取或设置当前刻度位置和标签的x轴范围。

8

Y轴标签

设置当前坐标系的y轴标签。

9

Y轴范围

获取或设置当前坐标系的y轴范围。

10

Y轴刻度

设置y轴的缩放比例。

11

Y轴刻度

获取或设置当前刻度位置和标签的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轴值。通过以下语句获得x中角度对应的正弦值,这些值将显示在y轴上:

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()

执行以上代码行后,将显示以下图形:

Simple Plot

现在,使用带有Matplotlib的Jupyter Notebook。

如前所述,从Anaconda Navigator或命令行启动Jupyter Notebook。在输入单元格中,输入Pyplot和NumPy的导入语句:

from matplotlib import pyplot as plt
import numpy as np

为了在Notebook本身(而不是单独的查看器)中显示绘图输出,请输入以下魔法命令:

%matplotlib inline

获取包含0到2π之间弧度角的ndarray对象x,以及每个角度的正弦值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()函数以在Notebook中生成正弦波显示(无需运行show()函数):

plt.plot(x,y)

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

Final Line of Code

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()

以上代码行生成以下输出:

Basic Plotting

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

符号 - , –, -., , . , , , 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()

它绘制如下所示的红色点:

Additional String Argument

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

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

以上代码行生成以下输出:

Multiple Plot Commands

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模块的show()函数将显示绘图。

考虑执行以下代码:

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()

输出

以上代码行生成以下输出:

Add Axes Method

在Jupyter Notebook中运行相同的代码将显示如下输出:

Jupyter Notebook Output

Matplotlib - Figure 类

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

fig = plt.figure()

下表显示了其他参数:

图形大小 以英寸为单位的(宽度,高度)元组
每英寸点数 每英寸点数
填充颜色 图形面片填充颜色
边框颜色 图形面片边框颜色
线宽 边框线宽

Matplotlib - Axes 类

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

通过调用add_axes()方法将坐标系对象添加到图形中。它返回坐标系对象并在位置rect [left, bottom, width, height]添加一个坐标系,其中所有数量都是图形宽度和高度的分数。

参数

以下是Axes类的参数:

  • rect - 一个包含[left, bottom, width, height]数量的4长度序列。

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

Axes类的以下成员函数向绘图添加不同的元素:

图例

Axes类的**legend()**方法向绘图图形添加图例。它有三个参数:

ax.legend(handles, labels, loc)

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

位置字符串 位置代码
最佳 0
右上方 1
左上方 2
左下方 3
右下方 4
右侧 5
左中部 6
右中部 7
下中部 8
上中部 9
中心 10

axes.plot()

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

颜色代码

字符 颜色
‘b’ 蓝色
‘g’ 绿色
‘r’ 红色
‘b’ 蓝色
‘c’ 青色
‘m’ 品红色
‘y’ 黄色
‘k’ 黑色
‘b’ 蓝色
‘w’ 白色

标记代码

字符 描述
‘.’ 点标记
‘o’ 圆形标记
‘x’ X标记
‘D’ 菱形标记
‘H’ 六边形标记
‘s’ 方形标记
‘+’ 加号标记

线型

字符 描述
‘-‘ 实线
‘—‘ 虚线
‘-.’ 点划线
‘:’ 点线
‘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()

执行以上代码行后,将生成以下绘图:

Advertisement Effect

Matplotlib - 多图

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

**subplot()**函数返回给定网格位置上的坐标系对象。此函数的调用签名为:

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

在当前图形中,该函数创建一个坐标系对象,并将其返回到nrows乘以ncols坐标系的索引位置。索引从1到nrows * ncols,按行优先顺序递增。如果nrows、ncols和index都小于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))

以上代码行生成以下输出:

Multiplots

图形类的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])

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

Add Spot Function

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

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()

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

Insert Plot

Matplotlib - Subplots() 函数

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

Plt.subplots(nrows, ncols)

此函数的两个整数参数指定子图网格的行数和列数。该函数返回一个图形对象和一个包含等于nrows*ncols的坐标系对象的元组。每个坐标系对象都可以通过其索引访问。这里我们创建一个2行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()

以上代码行生成以下输出:

Subplots Function

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 Functions

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()
Grids

Matplotlib - 坐标轴格式化

有时,一个或几个数据点远大于大部分数据。在这种情况下,坐标轴的刻度需要设置为对数刻度而不是普通刻度。这就是对数刻度。在 Matplotlib 中,可以通过将 axes 对象的 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()
Formatting Axes

坐标轴脊柱是连接坐标轴刻度标记的线条,用于划分绘图区域的边界。axes 对象在顶部、底部、左侧和右侧都有脊柱。

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

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()
Axis Spines

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()
Setting Limits

现在我们将 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()
Format The Limits

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()
Tick and Labels

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()
Twin Axes

Matplotlib - 条形图

条形图或条形图是一种图表或图形,它使用矩形条来呈现分类数据,其高度或长度与它们所代表的值成比例。条形图可以垂直或水平绘制。

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

Matplotlib API 提供了 **bar()** 函数,该函数既可以在 MATLAB 风格中使用,也可以在面向对象的 API 中使用。与 axes 对象一起使用的 bar() 函数的签名如下:

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

该函数创建一个条形图,其边界矩形的尺寸为 (x −width = 2; x + width=2; bottom; bottom + height)。

函数的参数为:

x 表示条形 x 坐标的标量序列。align 控制 x 是条形中心(默认值)还是左边缘。
height 标量或标量序列,表示条形的高度。
width 标量或类数组,可选。条形的宽度,默认为 0.8。
bottom 标量或类数组,可选。条形的 y 坐标,默认为 None。
align {'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 Bar Plot

在比较多个数量并在更改一个变量时,我们可能需要一个条形图,其中一个数量值使用一种颜色的条形。

我们可以通过调整条形的厚度和位置来绘制多个条形图。data 变量包含三个包含四个值的序列。下面的脚本将显示四个条形的三个条形图。条形的厚度将为 0.25 个单位。每个条形图将从前一个条形图偏移 0.25 个单位。data 对象是一个多字典,包含工程学院三个分院在过去四年中通过的学生人数。

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)
Multiple Bar Charts

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

**pyplot.bar()** 函数的可选 bottom 参数允许您为条形指定起始值。它不会从零运行到某个值,而是从底部运行到该值。对 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()
Scores

Matplotlib - 直方图

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

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

  • **分箱**值的范围。
  • 将值的整个范围划分为一系列区间。
  • 计算有多少值落入每个区间。

分箱通常指定为变量的连续的、不重叠的区间。

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

参数

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

x 数组或数组序列
bins 整数或序列或“auto”,可选
可选参数
range 分箱的下限和上限。
density 如果为 True,则返回元组的第一个元素将是归一化为形成概率密度 的计数。
cumulative 如果为 True,则计算直方图,其中每个分箱给出的计数为该分箱加上所有较小值的分箱的计数。
histtype 要绘制的直方图类型。默认为“bar”。
  • “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()

图如下所示:

Histogram

Matplotlib - 饼图

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

Matplotlib API 有一个 **pie()** 函数,它生成一个表示数组中数据的饼图。每个扇区的面积分数由 **x/sum(x)** 给出。如果 sum(x)<1,则 x 的值直接给出面积分数,并且不会规范化数组。生成的饼图将有一个大小为 1 - sum(x) 的空扇区。

如果图形和坐标轴是正方形,或者坐标轴纵横比相等,则饼图看起来最佳。

参数

下表列出了饼图的参数:

x 类数组。扇区大小。
labels 列表。提供每个扇区标签的字符串序列。
Colors matplotlibcolorargs 序列,饼图将通过它循环。如果为 None,则将使用当前活动周期中的颜色。
Autopct 字符串,用于使用其数值标记扇区。标签将放在扇区内。格式字符串将为 fmt%pct。

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

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()
Pie Chart

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()
Graded Scored

Matplotlib - 等高线图

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

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

自变量 x 和 y 通常限制在称为网格的规则网格中。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()
Filled Colours Plot

Matplotlib - 矢羽图

箭羽图(Quiver plot)以箭头形式显示速度向量,箭头的分量为 (u,v),位置为 (x,y)。

quiver(x,y,u,v)

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

参数

下表列出了箭羽图的不同参数:

x x
一维或二维数组,序列。箭头的 x 坐标。 y
一维或二维数组,序列。箭头的 y 坐标。 u
一维或二维数组,序列。箭头向量的 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()
Quicker Plot

Matplotlib - 箱线图

下面的代码绘制了一个简单的箭羽图:

Box Plot

箱线图(也称为须状图)显示一组数据的汇总信息,包括最小值、第一四分位数、中位数、第三四分位数和最大值。在箱线图中,我们从第一四分位数到第三四分位数画一个箱子。一条垂直线穿过箱子,位于中位数处。须线从每个四分位数延伸到最小值或最大值。

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)

让我们创建箱线图的数据。我们使用 `numpy.random.normal()` 函数创建模拟数据。它接受三个参数:正态分布的均值、标准差和所需的值的数量。

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()

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

Line of Code

Matplotlib - 小提琴图

上述代码将生成以下输出:

小提琴图类似于箱线图,但它们还显示了不同值处数据的概率密度。这些图包括数据中位数的标记和指示四分位数间距的箱子,就像标准箱线图一样。在此箱线图上叠加了核密度估计。与箱线图一样,小提琴图用于表示不同“类别”中变量分布(或样本分布)的比较。

import matplotlib.pyplot as plt
import numpy as np

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)

## combine these different collections into a list
data_to_plot = [collectn_1, collectn_2, collectn_3, collectn_4]

# Create a figure instance
fig = plt.figure()

# Create an axes instance
ax = fig.add_axes([0,0,1,1])

# Create the boxplot
bp = ax.violinplot(data_to_plot)
plt.show()
Violin Plot

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

Matplotlib - 三维绘图

尽管 Matplotlib 最初只考虑二维绘图,但在更高版本中,一些三维绘图工具建立在 Matplotlib 的二维显示之上,以提供一组用于三维数据可视化的工具。通过导入 Matplotlib 包中包含的 `mplot3d` 工具包来启用三维绘图。

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()

可以通过向任何正常的坐标轴创建例程传递关键字 `projection='3d'` 来创建一个三维坐标轴。

Three-dimensional Plotting

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

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 Scatter Plot

**三维散点图**是使用 `ax.scatter3D` 函数生成的。

Matplotlib - 三维等高线图

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 Contour

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

Matplotlib - 三维线框图

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()

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

Wireframe

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

Matplotlib - 三维曲面图

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()

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

Surface Plot

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

Matplotlib - 使用文本

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

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

以下命令用于在 Pyplot 接口中创建文本: text
在 Axes 的任意位置添加文本。 annotate
在 Axes 的任意位置添加注释,带可选箭头。 xlabel
向 Axes 的 x 轴添加标签。 ylabel
向 Axes 的 y 轴添加标签。 title
向 Axes 添加标题。 figtext
在 Figure 的任意位置添加文本。 suptitle

向 Figure 添加标题。

所有这些函数都创建并返回一个 `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()

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

Working With Text

Matplotlib - 数学表达式

以下脚本演示了上述一些函数的使用:

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

您可以通过将子集 TeX 标记放在一对美元符号 ($) 之内,在任何 Matplotlib 文本字符串中使用它。

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()

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

Mathematical Expressions

要创建下标和上标,请使用 '_' 和 '^' 符号:

Matplotlib - 使用图像

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

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

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

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

Matplotlib Image

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

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

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

Image Viewer

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

imgplot = plt.imshow(img)

Matplotlib - 变换

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

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

`ax.transData`

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

`ax.transAxes`

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

`fig.transFigure`

Figure 的坐标系。(0,0) 为 Figure 的左下角,(1,1) 为 Figure 的右上角。 显示坐标系

None

这是显示的像素坐标系。(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)

使用其他转换对象,可以控制位置。例如,如果要将上述文本放置在 Axes 坐标系的中心,请执行以下代码行:

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

打印页面