matplotlib中figure、subplot和axes的用法

小白学习matplotlib,经常会搞混figure、subplot、ax1和axes这些关键词。
本文从应用的角度出发讨论这些关键词。

1. 画一个简单的图

大部分新手用Python绘图的需求只是,一张图,图上几条曲线。
对此可用如下代码段实现。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
fig = plt.figure()
plt.plot(x, y)
plt.show()
输出结果如下:
matplotlib中figure、subplot和axes的用法_第1张图片
上述代码段用到了figure这个关键词。在Python里figure类似于画布。
好比,你和你的朋友去山上写生,画的画是在画布上。因此,绘图前第一步是铺设画布。这在matplotlib里用plt.figure()实现。
fig = plt.figure()这句话是对新建的画布命名。作为句柄方便以后对该画布修改。
plt.show()是输出最终的绘图结果。
这两句话是matplotlib里绘图操作必备的。

2. 一张画布上画多个画

前面介绍了绘图的基本操作,可以满足绝大部分应用需求。但是有的情况需要在一张图上画多张画。如下所示:
matplotlib中figure、subplot和axes的用法_第2张图片
可以用以下代码段实现。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
x1 = np.sin(x)
x2 = np.cos(x)
x3 = np.tan(x)
x4 = x ** 2
fig = plt.figure()

plt.subplot(221)
plt.plot(x, x1)

plt.subplot(222)
plt.plot(x, x2)

plt.subplot(223)
plt.plot(x, x3)

plt.subplot(224)
plt.plot(x, x4)
plt.show()
可以看到,这里与前面相比,改动的地方在fig = plt.figure()和plt.show()之间。
subplot将画布分割成几个部分,221表示将画布分成两行两列,下面的绘图操作在序列号为1的位置。
注意,同一画布只能有一种分割方式。不然会发生重叠。
如将中间四步换成:
plt.subplot(221)
plt.plot(x, x1)

plt.subplot(211)
plt.plot(x, x2)
会出现以下结果:
matplotlib中figure、subplot和axes的用法_第3张图片
可以看到,第二张图将第一张完全覆盖。
覆盖的原因就是,同一张画布只能有一种分割方式。如果想要实现两种分割方式只能新建一张画布:
fig1 = plt.figure()

plt.subplot(221)
plt.plot(x, x1)

fig2 = plt.figure()
plt.subplot(211)
plt.plot(x, x2)
matplotlib中figure、subplot和axes的用法_第4张图片
运行后会弹出两个对话框,里边有两张图。

3. ax1作为句柄

上述两小节已经可以实现绘图的基本操作,但是很多文献里有:
fig, axes=plt.subplots(2,2)
ax1 = axes[0, 0]
ax1.plot(x, x1)
看到这种,很多人就又晕了。这里引入了关键词axes。
axis在英文里是坐标轴的意思,axes是axis的复数形式。
Python里ax1指某一特定区域,axes指很多区域,是一个矩阵。
第一句话fig, axes=plt.subplots(2,2)将名为“fig”的画布按照两行两列的方式划分。然后将划分好的四小块儿放到axes这个矩阵里。
矩阵也是两行两列,所以第二句话将第一块儿区域赋值给了ax1.
这里的ax1是一个句柄,它后面跟的函数就是在画布“fig”上,第一块儿区域,绘图。类似plt。
原先是plt.plot现在是ax1.plot。plt.scatter变成了ax1.scatter。
Python的官方文档强调,绘图操作的直接应用对象应该在ax上,即绘图区域。

ax1作为句柄还有另一种情形:
ax1 = fig.add_subplot(221)
这种方式绕过了建立axes矩阵,直接将ax1变成句柄。

(以上ax1是自己命名的,不是Python关键字。也可以命名为ax2,bx1)
此外还有add_axes,它可以在原有绘图区域中新添一块区域绘图。详见这篇博客
matplotlib命令与格式:图像(figure)与子区域(axes)布局与规划
.
.
.
.

.
.

新人第一篇文章,请大家点赞支持!

你可能感兴趣的:(python,matplotlib,数据可视化)