笔记
单击此处 下载完整的示例代码
Pyplot 教程#
pyplot 接口介绍。另请参阅 快速入门指南,了解 Matplotlib 如何工作的概述,以及Matplotlib 应用程序接口 (API),了解支持的用户 API 之间的权衡。
pyplot 简介#
matplotlib.pyplot
是使 matplotlib 像 MATLAB 一样工作的函数集合。每个pyplot
函数都会对图形进行一些更改:例如,创建图形、在图形中创建绘图区域、在绘图区域中绘制一些线、用标签装饰绘图等。
在matplotlib.pyplot
函数调用中保留各种状态,以便它跟踪诸如当前图形和绘图区域之类的内容,并且绘图函数被定向到当前轴(请注意,此处和文档中大多数地方的“轴”是指到图形的轴
部分,
而不是多个轴的严格数学术语)。
笔记
隐式 pyplot API 通常不那么冗长,但也不像显式 API 那样灵活。您在此处看到的大多数函数调用也可以作为来自Axes
对象的方法调用。我们建议浏览教程和示例以了解其工作原理。有关支持的用户 API 的权衡说明,请参阅Matplotlib 应用程序接口 (API) 。
使用 pyplot 生成可视化非常快:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
plt.show()
您可能想知道为什么 x 轴的范围是 0-3 而 y 轴的范围是 1-4。如果您向 提供单个列表或数组
plot
,matplotlib 会假定它是一个 y 值序列,并自动为您生成 x 值。由于 python 范围从 0 开始,默认的 x 向量的长度与 y 相同,但从 0 开始。因此 x 数据是
.[0, 1, 2, 3]
plot
是一个通用函数,可以接受任意数量的参数。例如,要绘制 x 与 y,您可以编写:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
[<matplotlib.lines.Line2D object at 0x7f2cf9d23b20>]
格式化绘图的样式#
对于每对 x、y 参数,都有一个可选的第三个参数,它是表示绘图颜色和线型的格式字符串。格式字符串的字母和符号来自 MATLAB,您可以将颜色字符串与线型字符串连接起来。默认格式字符串是“b-”,它是一条蓝色实线。例如,要绘制上面的红色圆圈,你会发出
有关线条样式和格式字符串的完整列表,请参阅plot
文档。上面示例中的
axis
函数采用一个列表并指定轴的视口。[xmin, xmax, ymin, ymax]
如果 matplotlib 仅限于使用列表,那么它对于数字处理将毫无用处。通常,您将使用numpy数组。事实上,所有序列都在内部转换为 numpy 数组。下面的示例说明了使用数组在一个函数调用中绘制具有不同格式样式的多条线。
用关键字字符串绘图#
在某些情况下,您的数据格式允许您使用字符串访问特定变量。例如,使用
numpy.recarray
或pandas.DataFrame
。
Matplotlib 允许您为这样的对象提供data
关键字参数。如果提供,那么您可以使用与这些变量对应的字符串生成图。
data = {'a': np.arange(50),
'c': np.random.randint(0, 50, 50),
'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100
plt.scatter('a', 'b', c='c', s='d', data=data)
plt.xlabel('entry a')
plt.ylabel('entry b')
plt.show()
用分类变量绘图#
也可以使用分类变量创建图。Matplotlib 允许您将分类变量直接传递给许多绘图函数。例如:
names = ['group_a', 'group_b', 'group_c']
values = [1, 10, 100]
plt.figure(figsize=(9, 3))
plt.subplot(131)
plt.bar(names, values)
plt.subplot(132)
plt.scatter(names, values)
plt.subplot(133)
plt.plot(names, values)
plt.suptitle('Categorical Plotting')
plt.show()
控制线属性#
线条有许多可以设置的属性:线宽、虚线样式、抗锯齿等;见matplotlib.lines.Line2D
。有几种方法可以设置线属性
使用关键字参数:
使用
Line2D
实例的 setter 方法。plot
返回Line2D
对象列表;例如,。在下面的代码中,我们将假设我们只有一行,因此返回的列表长度为 1。我们使用元组解包 来获取该列表的第一个元素:line1, line2 = plot(x1, y1, x2, y2)
line,
使用
setp
. 下面的示例使用 MATLAB 风格的函数来设置行列表的多个属性。setp
透明地处理对象列表或单个对象。您可以使用 python 关键字参数或 MATLAB 样式的字符串/值对:lines = plt.plot(x1, y1, x2, y2) # use keyword arguments plt.setp(lines, color='r', linewidth=2.0) # or MATLAB style string value pairs plt.setp(lines, 'color', 'r', 'linewidth', 2.0)
这是可用的Line2D
属性。
财产 |
值类型 |
---|---|
α |
漂浮 |
动画 |
[真| 错误的] |
抗锯齿或aa |
[真| 错误的] |
剪辑框 |
一个 matplotlib.transform.Bbox 实例 |
夹上 |
[真| 错误的] |
剪辑路径 |
一个 Path 实例和一个 Transform 实例,一个 Patch |
颜色或c |
任何 matplotlib 颜色 |
包含 |
命中测试功能 |
dash_capstyle |
[ |
dash_joinstyle |
[ |
破折号 |
以点为单位的开/关墨水顺序 |
数据 |
(np.array xdata,np.array ydata) |
数字 |
一个 matplotlib.figure.Figure 实例 |
标签 |
任何字符串 |
线条样式或 ls |
[ |
线宽或lw |
以点为单位的浮点值 |
标记 |
[ |
markeredgecolor 或 mec |
任何 matplotlib 颜色 |
标记边缘宽度或mew |
以点为单位的浮点值 |
markerfacecolor 或 mfc |
任何 matplotlib 颜色 |
标记大小或毫秒 |
漂浮 |
马克韦尔 |
[ 无 | 整数 | (开始,大步)] |
拣货员 |
用于交互式选线 |
镐半径 |
选线选择半径 |
solid_capstyle |
[ |
solid_joinstyle |
[ |
转换 |
一个 matplotlib.transforms.Transform 实例 |
可见的 |
[真| 错误的] |
数据 |
np.array |
数据 |
np.array |
佐德 |
任何数字 |
要获取可设置行属性的列表,请
setp
使用一行或多行作为参数调用该函数
In [69]: lines = plt.plot([1, 2, 3])
In [70]: plt.setp(lines)
alpha: float
animated: [True | False]
antialiased or aa: [True | False]
...snip
使用多个图形和轴#
MATLAB 和pyplot
具有当前图形和当前坐标区的概念。所有绘图功能都适用于当前坐标区。该函数gca
返回当前坐标区(一个
matplotlib.axes.Axes
实例),并gcf
返回当前图形(一个matplotlib.figure.Figure
实例)。通常,您不必担心这一点,因为这一切都在幕后处理。下面是创建两个子图的脚本。
这里的figure
调用是可选的,因为如果不存在则将创建一个图形,就像如果不存在则将创建一个轴(相当于显式
subplot()
调用)。该subplot
调用指定范围从 1
到。调用中的逗号是可选的 if 。所以等同于。numrows,
numcols, plot_number
plot_number
numrows*numcols
subplot
numrows*numcols<10
subplot(211)
subplot(2, 1, 1)
您可以创建任意数量的子图和轴。如果您想手动放置轴,即不在矩形网格上,请使用axes
,它允许您将位置指定为所有值都在小数(0 到 1)坐标中的位置。有关手动放置轴的示例,请参阅Axes Demo ;有关具有大量子图的示例,请参阅多个子图。axes([left, bottom,
width, height])
figure
您可以通过使用具有不断增加的图形编号的多个调用来创建多个图形
。当然,每个图形都可以包含您想要的任意数量的轴和子图:
import matplotlib.pyplot as plt
plt.figure(1) # the first figure
plt.subplot(211) # the first subplot in the first figure
plt.plot([1, 2, 3])
plt.subplot(212) # the second subplot in the first figure
plt.plot([4, 5, 6])
plt.figure(2) # a second figure
plt.plot([4, 5, 6]) # creates a subplot() by default
plt.figure(1) # figure 1 current; subplot(212) still current
plt.subplot(211) # make subplot(211) in figure1 current
plt.title('Easy as 1, 2, 3') # subplot 211 title
您可以使用 清除当前图形,使用 清除clf
当前坐标区cla
。如果您发现在幕后为您维护状态(特别是当前图像、图形和轴)很烦人,请不要绝望:这只是面向对象 API 的一个薄状态包装,您可以使用它来代替(见艺术家教程)
如果您要制作大量图形,您还需要注意一件事:图形所需的内存不会完全释放,直到图形被显式关闭
close
。删除对图形的所有引用,和/或使用窗口管理器杀死图形出现在屏幕上的窗口是不够的,因为 pyplot 维护内部引用直到close
被调用。
处理文本#
text
可用于在任意位置添加文本
xlabel
,ylabel
和title
用于在指定位置添加文本(有关更详细的示例,请参见Matplotlib Plots中的文本)
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# the histogram of the data
n, bins, patches = plt.hist(x, 50, density=True, facecolor='g', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
所有text
函数都返回一个matplotlib.text.Text
实例。就像上面的行一样,您可以通过将关键字参数传递给文本函数或使用来自定义属性setp
:
t = plt.xlabel('my data', fontsize=14, color='red')
这些属性在文本属性和布局中有更详细的介绍。
在文本中使用数学表达式#
matplotlib 接受任何文本表达式中的 TeX 方程表达式。例如写表达式\(\sigma_i=15\)在标题中,您可以编写一个用美元符号包围的 TeX 表达式:
plt.title(r'$\sigma_i=15$')
前面r
的标题字符串很重要——它表示该字符串是一个原始字符串,而不是将反斜杠视为 python 转义。matplotlib 有一个内置的 TeX 表达式解析器和布局引擎,并提供自己的数学字体——有关详细信息,请参阅
编写数学表达式。因此,您可以跨平台使用数学文本,而无需安装 TeX。对于那些安装了 LaTeX 和 dvipng 的人,您还可以使用 LaTeX 来格式化您的文本并将输出直接合并到您的显示图形或保存的后记中——请参阅Text rendering with LaTeX。
注释文本#
上述基本text
功能的使用将文本放置在轴上的任意位置。文本的一个常见用途是注释绘图的某些特征,并且该
annotate
方法提供帮助功能以使注释变得容易。在注释中,需要考虑两点:参数表示的被注释xy
位置和文本的位置xytext
。这两个参数都是元组。(x, y)
在这个基本示例中,xy
(箭头)和xytext
位置(文本位置)都在数据坐标中。有多种其他坐标系可供选择——有关详细信息,请参阅
基本注释和高级注释。更多示例可以在
Annotating Plots中找到。
对数轴和其他非线性轴#
matplotlib.pyplot
不仅支持线性轴刻度,还支持对数和logit刻度。如果数据跨越多个数量级,则通常使用此方法。更改轴的比例很容易:
plt.xscale('log')
下面显示了 y 轴具有相同数据和不同比例的四个图的示例。
# Fixing random state for reproducibility
np.random.seed(19680801)
# make up some data in the open interval (0, 1)
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))
# plot with various axes scales
plt.figure()
# linear
plt.subplot(221)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)
# log
plt.subplot(222)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)
# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthresh=0.01)
plt.title('symlog')
plt.grid(True)
# logit
plt.subplot(224)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)
# Adjust the subplot layout, because the logit one may take more space
# than usual, due to y-tick labels like "1 - 10^{-3}"
plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25,
wspace=0.35)
plt.show()
也可以添加您自己的比例,详情请参阅matplotlib.scale
。
脚本总运行时间:(0分4.033秒)