Gridspec模块的具体介绍
GridSpec是matplotlib中用于自定义子图布局的类。通过显式地创建GridSpec类对象,可以自定义画布中子图的布局结构,使得子图能够更好地适应画布。GridSpec类对象的使用方式与数组的使用方式相似,采用索引或切片的形式访问每个布局元素。此外,matplotlib中还为Figure对象提供了快速添加布局结构的方法add_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:可选参数,指定子图所属的Figure对象。
- left、bottom、right、top:可选参数,指定子图网格的边界位置,取值范围为0到1。
- wspace:可选参数,指定子图之间的水平间距,取值范围为0到1。
- hspace:可选参数,指定子图之间的垂直间距,取值范围为0到1。
- width_ratios:可选参数,指定每列子图的宽度比例。
- height_ratios:可选参数,指定每行子图的高度比例。
其使用GridSpec()方法创建子图的布局结构需要创建子图和GridSpec类对象,之后在调用add_subplot()方法时传入GridSpec类对象即可,例如
#导入模块
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
#创建画布面向对象
fig = plt.figure()
#创建区域规划图
gs = GridSpec(2, 2, figure=fig)
#根据给定的"区域规划图",创建对应的坐标系实例
ax1 = fig.add_subplot(gs[0, 0])#二维数组的索引
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, :])
#图像展示
plt.show()
上述代码中,我们创建了一个2x2的GridSpec类对象gs,并将其传入add_subplot()方法中,以创建三个子图。其中,第一个子图占据了第一行第一列,第二个子图占据了第一行第二列,第三个子图占据了第二行的所有列。
注意:Jupyter Notebook 默认输出的图片是静态的,无法进行放大等操作,可以添加指令,需要重启notebook才能使用。
在notebook中使用plt绘图共有三种模式:
- %matplotlib inline:这是默认的模式,输出的图片是静态的
- %matplotlib auto:在这个模式下会弹出一个单独 的绘图窗口,和在pycharm中一样
- %matplotlib notebook:在这个模式下会在notebook中产生一个绘图窗口,能够对图片进行放大缩小等操作。
下面来说明使用GridSpec ()方法创建子图的布局结构
一、创建一个2行2列的4个子图
#导入模块
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig_1 = plt.figure()
#创建“区域规划图”实例(GridSpec实例)
spec_1 = gridspec.GridSpec(nrows=2, ncols=2, figure=fig_1)
#根据给定的“区域规划图”,创建对应的坐标系实例
ax1 = fig_1.add_subplot(spec_1[0,0]) #二维数组的索引
ax2 = fig_1.add_subplot(spec_1[0,1])
ax3 = fig_1.add_subplot(spec_1[1,0])
ax4 = fig_1.add_subplot(spec_1[1,1])
#图像展示
plt.show()
图片展示
二、创建2行2列4个子图的基础上调整相对宽度和相对高度
#导入模块
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig = plt.figure()
#创建“区域规划图”实例(GridSpec实例)
spec = gridspec.GridSpec(nrows=2,
ncols=2,
figure=fig,
width_ratios=[2,4], #设置坐标系的相对宽度(每个坐标系宽度=设定值/sum(设定值))
height_ratios=[2,4] #设置坐标系的相对高度(每个坐标系宽度=设定值/sum(设定值))
)
#根据给定的"区域规划图",创建对应的坐标系实例
ax1 = fig.add_subplot(spec[0,0]) # 二维数组的索引操作
ax2 = fig.add_subplot(spec[0,1])
ax3 = fig.add_subplot(spec[1,0])
ax4 = fig.add_subplot(spec[1,1])
#图像展示
plt.show()
图片展示
三、在创建2行2列4个子图的基础上表示子图的范围
#导入模块
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig_1 = plt.figure()
#创建“区域规划图”GridSpec实例
spec_1 = gridspec.GridSpec(nrows=2, ncols=2, figure=fig_1,
left=0.25, right=0.7, top=0.7, bottom=0.25
#把所有坐标系实例“打包”在一起,整体伸缩/平移)
#根据给定的“区域规划图”,创建对应的坐标系实例
ax1 = fig_1.add_subplot(spec_1[0,0])
ax2 = fig_1.add_subplot(spec_1[0,1]) #二维数组索引操作
ax3 = fig_1.add_subplot(spec_1[1,0])
ax4 = fig_1.add_subplot(spec_1[1,1])
#图像展示
plt.show()
图片展示