matplotlib的gridspaec模块是专门指定画布中子图位置的模块,该模块中包含一个GridSpec类,通过显示地创建GridSpec类对象来自定义画布中子图的布局结构,使得子图能够更好地适应画布。GridSpec类的结构方法的语法格式如下:
GridSpec(nrows,ncols,figure=None,left=None,bottom=None,right=None,top=None,
wspace=None,hspace=None,width_ratios=None,height_ratios=None)
该方法常用的参数含义如下:
nrows:表示行数
ncols:表示列数
figure:表示布局的画布
left,bottom,right,top:表示子图的范围
wspace:表示子图之间预留的宽度量
hspace:表示子图之间预留的高度量
GridSpec类对象的使用方式与数组的使用方式相似,采用索引或切片的形式访问每一个布局的元素。此外,matplotlib中的Figure对象的提供了快速添加布局结构的方法add_gridspec()。
(1)使用GridSpec()方法创建子图的布局结构
先分别创建figure和GridSpec实例,然后将 gridspec 实例的元素传递给 add_subplot() 方法以创建轴对象。
gridspec元素的访问方式与 numpy 数组相同。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig2 = plt.figure(constrained_layout=True)
spec2 = gridspec.GridSpec(ncols=2, nrows=2, figure=fig2)
f2_ax1 = fig2.add_subplot(spec2[0, 0])
f2_ax2 = fig2.add_subplot(spec2[0, 1])
f2_ax3 = fig2.add_subplot(spec2[1, 0])
f2_ax4 = fig2.add_subplot(spec2[1, 1])
plt.show()
运行结果:
gridspec 的强大之处在于能够创建跨行和列的子图。注意用于选择每个子图将占据的gridspec部分的 Numpy 切片语法。
我们也可以使用 Figure.add_gridspec方法创建不同宽度的子图:
import matplotlib.pyplot as plt
fig3 = plt.figure(constrained_layout=True)
gs = fig3.add_gridspec(3, 3)
f3_ax1 = fig3.add_subplot(gs[0, :])
f3_ax1.set_title('gs[0, :]')
f3_ax2 = fig3.add_subplot(gs[1, :-1])
f3_ax2.set_title('gs[1, :-1]')
f3_ax3 = fig3.add_subplot(gs[1:, -1])
f3_ax3.set_title('gs[1:, -1]')
f3_ax4 = fig3.add_subplot(gs[-1, 0])
f3_ax4.set_title('gs[-1, 0]')
f3_ax5 = fig3.add_subplot(gs[-1, -2])
f3_ax5.set_title('gs[-1, -2]')
plt.show()
运行结果:
而后我们利用自定义布局的GridSpec实例,在画布上创建如图所示的坐标系实例:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig3=plt.figure()
#创建“区域规划图”实例
spec3 =gridspec.GridSpec(3, 4,figure=fig3)
#根据给定的“区域规划图”,创建对应的坐标系实例
ax1= plt.subplot(spec3[0,0:4])
ax2= plt.subplot(spec3[1,0:2])
ax3= plt.subplot(spec3[1,2:4])
ax4= plt.subplot(spec3[2,0:1])
plt.subplot(349,polar=True)
ax5= plt.subplot(spec3[2,1:4])
#调整子图的位置
plt.tight_layout()
运行结果: