有时候需要从多个角度对数据进行对比。Matplotlib为此提出了子图(subplot)的概念:在较大的图形中同时放置一组较小的坐标轴。这些子图可能是画中画(inset)、网格图(gridof plots),或者是其他更复杂的布局形式。

plt.axes创建子图

创建坐标轴最基本的方法就是使用plt.axes 函数。这个函数的默认配置是创建一个标准的坐标轴,填满整张图。它还有一个可选参数,由图形坐标系统的四个值构成。这四个值分别表示图形坐标系统的[bottom, left, width, height](底坐标、左坐 标、宽度、高度),数值的取值范围是左下角(原点)为 0,右上角为 1。

如果想要在右上角创建一个画中画,那么可以首先将 x y 设置为 0.65(就是坐标轴原点 位于图形高度 65% 和宽度 65% 的位置),然后将 x y 扩展到 0.2(也就是将坐标轴的宽 度与高度设置为图形的 20%)。

ax1 = plt.axes() # 默认坐标轴ax2 = plt.axes([0.65, 0.65, 0.2, 0.2])




python plt subplot子图高度 matplotlib设置子图长宽比_数组


使用fig.add_axes()创建两个竖直排列的坐标轴。

fig = plt.figure()ax1 = fig.add_axes([0.1, 0.5, 0.8, 0.4], xticklabels=[], ylim=(-1.2, 1.2))ax2 = fig.add_axes([0.1, 0.1, 0.8, 0.4], ylim=(-1.2, 1.2))x = np.linspace(0, 10)ax1.plot(np.sin(x))ax2.plot(np.cos(x))


python plt subplot子图高度 matplotlib设置子图长宽比_matplotlib 子图超过4个_02


现在就可以看到两个紧挨着的坐标轴(上面的坐标轴没有刻度):上子图(起点 y 坐标为

0.5 位置)与下子图的 x 轴刻度是对应的(起点 y 坐标为 0.1,高度为 0.4)。

plt.subplot创建网格图

若干彼此对齐的行列子图是常见的可视化任务,Matplotlib 拥有一些可以轻松创建它们的 简便方法。最底层的方法是用 plt.subplot() 在一个网格中创建一个子图。这个命令有三个整型参数——将要创建的网格子图行数、列数和索引值,索引值从 1 开始,从左上角到 右下角依次增大。

for i in range(1, 7): plt.subplot(2, 3, i)plt.text(0.5, 0.5, str((2, 3, i)), fontsize=18, ha='center')


python plt subplot子图高度 matplotlib设置子图长宽比_子图_03


plt.subplots_adjust 命令可以调整子图之间的间隔。用面向对象接口的命令 fig.add_subplot() 可以取得同样的效果。

fig = plt.figure()fig.subplots_adjust(hspace=0.4, wspace=0.4)for i in range(1, 7): ax = fig.add_subplot(2, 3, i) ax.text(0.5, 0.5, str((2, 3, i)), fontsize=18, ha='center')


python plt subplot子图高度 matplotlib设置子图长宽比_子图_04


我们通过 plt.subplots_adjust 的 hspace 与 wspace 参数设置与图形高度与宽度一致的子图间距,数值以子图的尺寸为单位

plt.subplots快速创建网格

当你打算创建一个大型网格子图时,就没办法使用前面那种亦步亦趋的方法了,尤其是当 你想隐藏内部子图的 x 轴与 y 轴标题时。出于这一需求,plt.subplots() 实现了你想要的功能(需要注意此处 subplots 结尾多了个 s)。这个函数不是用来创建单个子图的,而是用一行代码创建多个子图,并返回一个包含子图的 NumPy 数组。关键参数是行数与列数, 以及可选参数 sharex 与 sharey,通过它们可以设置不同子图之间的关联关系。

例如,创建一个 2×3 网格子图,每行的 3 个子图使用相同的 y 轴坐标,每列的 2 个子图 使用相同的 x 轴坐标。

fig, ax = plt.subplots(2, 3, sharex='col', sharey='row')


python plt subplot子图高度 matplotlib设置子图长宽比_数组_05


设置 sharex 与 sharey 参数之后,我们就可以自动去掉网格内部子图的标签,让图形看起来更整洁。坐标轴实例网格的返回结果是一个 NumPy 数组,这样就可以通过标准的数组取值方式轻松获取想要的坐标轴了。

# 坐标轴存放在一个NumPy数组中,按照[row, col]取值 for i in range(2): for j in range(3): ax[i, j].text(0.5, 0.5, str((i, j)), fontsize=18, ha='center')fig


python plt subplot子图高度 matplotlib设置子图长宽比_matplotlib 子图超过4个_06


plt.GridSpec实现更复杂的排列方式

如果想实现不规则的多行多列子图网格,plt.GridSpec() 是最好的工具。plt.GridSpec()对象本身不能直接创建一个图形,它只是 plt.subplot() 命令可以识别的简易接口。

例如, 创建一个带行列间距的 2×3 网格。

grid = plt.GridSpec(2, 3, wspace=0.4, hspace=0.3)

可以通过类Python 切片的语法,设置子图的位置和扩展尺寸。

plt.subplot(grid[0, 0])plt.subplot(grid[0, 1:])plt.subplot(grid[1, :2])plt.subplot(grid[1, 2])


python plt subplot子图高度 matplotlib设置子图长宽比_子图_07


这四种不同的方式,在不同的场景中使用非常的高效。第四种方式适合灵活的排列方式,第三种只要一行代码,就可以快速创建。第二种格子图,方便多个数据对比。第一种在不同的位置创建一个图中图。