GridSpec:
matplotlib 的 gridspec 模块是专门指定画布中子图位置的模块,该模块中包含一个 GridSpec类,通过显式地创建GridSpec类对象来自定义画布中子图的布局结构,使得子图能够更好地适应画布。
GridSpec类的构造方法的语法格式如下:
GridSpec(nrows, ncols, figure=None, left=None, bottom=None, right=None, top=None, hspace=None, wspace=None, width_ratios=None, height_ratios=None)
该方法常用参数的含义如下:
✔️ncols : 表示列数。
✔️nrows : 表示行数。
✔️figure : 表示布局的画布。
✔️wspace : 表示子图之间预留的宽度量。
✔️left, bottom,right,top : 表示子图的范围。
✔️hspace : 表示子图之间预留的高度量。
GridSpec类对象的使用方式与数组的使用方式相似,采用索引或切片的形式访问每个布局元素。此外,matplotlib中还为Figure对象提供了快速添加布局结构的方法add_gridspec()。下面分别使用两种方式创建自定义的布局结构。
(1)使用GridSpec()方法创建子图的布局结构
这种方式需要创建子图和GridSpec类对象,之后在调用add_subplot()方法时传入 GridSpec类对象即可。
具体示例如下:
导入所需库与plt绘图模式
%matplotlib auto
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
Jupyter Notebook 默认输出的图片是静态的,无法进行放大等操作,可以添加指令:
%matplotlib auto
这样就能够在notebook中进行放大缩小等交互操作了。
在notebook中使用plt绘图共有三种模式:
- %matplotlib inline:这是默认的模式,输出的图片是静态的
- %matplotlib auto:在这个模式下会弹出一个单独 的绘图窗口,和在pycharm中一样
- %matplotlib notebook:在这个模式下会在notebook中产生一个绘图窗口,能够对图片进行放大缩小等操作。
需要重启notebook才能使用
创建画布实例
fig = plt.figure()
创建“区域规划图”实例(GridSpec实例)
spec = gridspec.GridSpec(nrows=2,
ncols=2,
figure=fig,
# hspace=2, #坐标系实例之间纵向间距
# wspace=2, #坐标系实例之间横向间距
# left=0.25,right=0.9,top=0.9,bottom=0.25, #把所有坐标实例打包在一起,整体伸缩/平移
width_ratios=[3,1], #设置坐标系的相对宽度(每个坐标系宽度=设定值/sum(设定值))
height_ratios=[3,1] #设置坐标系的相对高度(每个坐标系宽度=设定值/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()
完整示例代码:
# 导入所需库与plt绘图模式
%matplotlib auto
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,
# hspace=2, #坐标系实例之间纵向间距
# wspace=2, #坐标系实例之间横向间距
# left=0.25,right=0.9,top=0.9,bottom=0.25, #把所有坐标实例打包在一起,整体伸缩/平移
width_ratios=[3,1], #设置坐标系的相对宽度(每个坐标系宽度=设定值/sum(设定值))
height_ratios=[3,1] #设置坐标系的相对高度(每个坐标系宽度=设定值/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)使用add_gridspec0方法向画布添加布局结构
这种方式需要创建画布和GridSpec类对象,之后在调用add_subplot()方法添加子图时传人一个GridSpec类对象即可。
导入所需库与plt绘图模式
%matplotlib auto
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,
# hspace=2, #坐标系实例之间纵向间距
# wspace=2, #坐标系实例之间横向间距
left=0.25,right=0.9,top=0.9,bottom=0.25, #把所有坐标实例打包在一起,整体伸缩/平移
width_ratios=[3,1], #设置坐标系的相对宽度(每个坐标系宽度=设定值/sum(设定值))
height_ratios=[3,1] #设置坐标系的相对高度(每个坐标系宽度=设定值/sum(设定值))
)
传入对象
ax1 = fig.add_subplot(gs[0,:]) # 二维数组的切片操作
ax1.set_title('gs[0, :]')
ax2 = fig.add_subplot(gs[1,:-1])
ax2.set_title('gs[1, :-1]')
ax3 = fig.add_subplot(gs[1:,-1])
ax3.set_title('gs[1:,-1]')
ax4 = fig.add_subplot(gs[-1,0])
ax4.set_title('gs[-1,0]')
ax5 = fig.add_subplot(gs[-1,-2])
ax5.set_title('gs[-1,-2]')
展示图表
plt.show()
完整代码如下:
# 导入所需库与plt绘图模式
%matplotlib auto
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 创建画布实例
fig = plt.figure()
# 创建GridSpec类对象
gs = fig.add_gridspec(3,3)
# 创建“区域规划图”实例(GridSpec实例)
spec = gridspec.GridSpec(nrows=2,
ncols=2,
figure=fig,
# hspace=2, #坐标系实例之间纵向间距
# wspace=2, #坐标系实例之间横向间距
left=0.25,right=0.9,top=0.9,bottom=0.25, #把所有坐标实例打包在一起,整体伸缩/平移
width_ratios=[3,1], #设置坐标系的相对宽度(每个坐标系宽度=设定值/sum(设定值))
height_ratios=[3,1] #设置坐标系的相对高度(每个坐标系宽度=设定值/sum(设定值))
)
# 传入对象
ax1 = fig.add_subplot(gs[0,:]) # 二维数组的切片操作
ax1.set_title('gs[0, :]')
ax2 = fig.add_subplot(gs[1,:-1])
ax2.set_title('gs[1, :-1]')
ax3 = fig.add_subplot(gs[1:,-1])
ax3.set_title('gs[1:,-1]')
ax4 = fig.add_subplot(gs[-1,0])
ax4.set_title('gs[-1,0]')
ax5 = fig.add_subplot(gs[-1,-2])
ax5.set_title('gs[-1,-2]')
# 展示图表
plt.show()