当带有标题的多个子图并排显示时,多个子图会因区域过于紧凑而出现标题和坐标轴之间互相重叠的问题,而且子图元素的摆放过于紧凑,也影响用户的正常查看。matplotlib中提供了一些调整子图布局的方法,其中之一就是自定义布局。
自定义布局
matplotlib的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:表示子图之间预留的高度量
width_ratios:表示 设置坐标系的相对宽度
height_ratios:表示 设置坐标系的相对高度
使用 GridSpec() 方法创建子图的布局结构
● nrows=2,ncols=2
绘制 2行2列 带有坐标轴标签的子图
#导入模块
%matplotlib auto
import numpy as up
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig2 = plt.figure()
#创建 “区域规划图” 实例
#nrows=2,ncols=2 2行2列
spec2 = gridspec.GridSpec(nrows=2,ncols=2,figure=fig2)
#根据给定的 “区域规划图” ,创建对应的坐标系实例
ax1 = fig2.add_subplot(spec2[0,0])
ax2 = fig2.add_subplot(spec2[0,1])
ax3 = fig2.add_subplot(spec2[1,0])
ax4 = fig2.add_subplot(spec2[1,1])
#展示图表
plt.show()
运行程序,效果如图:
其中,GridSpec类对象的使用方式与数组的使用方式相似,采用 索引 或 切片 的形式访问每个布局元素。使用如下:
● spec2[0,:] 切片
● spec2[1,0] 索引
#导入模块
%matplotlib auto
import numpy as up
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig2 = plt.figure()
#创建 “区域规划图” 实例
spec2 = gridspec.GridSpec(nrows=2,ncols=2,figure=fig2)
#根据给定的 “区域规划图” ,创建对应的坐标系实例
ax1 = fig2.add_subplot(spec2[0,:]) #二维数组的切片操作
ax2 = fig2.add_subplot(spec2[0,1])
ax3 = fig2.add_subplot(spec2[1,0]) #二维数组的索引操作
ax4 = fig2.add_subplot(spec2[1,1])
#展示图表
plt.show()
运行程序,效果如图:
● hspace=2,wspace=2
子图之间纵向为2和横向为2的间距
#导入模块
%matplotlib auto
import numpy as up
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig2 = plt.figure()
#创建 “区域规划图” 实例
#hspace=2,wspace=2 坐标系实例之间纵向和横向间距
spec2 = gridspec.GridSpec(nrows=2,ncols=2,figure=fig2,
hspace=2,wspace=2)
#根据给定的 “区域规划图” ,创建对应的坐标系实例
ax1 = fig2.add_subplot(spec2[0,0])
ax2 = fig2.add_subplot(spec2[0,1])
ax3 = fig2.add_subplot(spec2[1,0])
ax4 = fig2.add_subplot(spec2[1,1])
#展示图表
plt.show()
运行程序,效果如图:
● left , bottom, right, top 控制子图的范围
#导入模块
%matplotlib auto
import numpy as up
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig2 = plt.figure()
#创建 “区域规划图” 实例
#left=0.25,righr=0.9,top=0.9,bottom=0.25 把所有坐标系实例“打包”在一起,整体伸缩/平移
spec2 = gridspec.GridSpec(nrows=2,ncols=2,figure=fig2,
left=0.25,right=0.9,top=0.9,bottom=0.25)
#根据给定的 “区域规划图” ,创建对应的坐标系实例
ax1 = fig2.add_subplot(spec2[0,0])
ax2 = fig2.add_subplot(spec2[0,1])
ax3 = fig2.add_subplot(spec2[1,0])
ax4 = fig2.add_subplot(spec2[1,1])
#展示图表
plt.show()
运行程序,效果如图:
● width_ratios:表示设置坐标系的相对宽度(列)
#导入模块
%matplotlib auto
import numpy as up
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig2 = plt.figure()
#创建 “区域规划图” 实例
#width_ratios 设置坐标系的相对宽度 (列)
#每个坐标系的宽度 = 设定值/sum(设定值)
spec2 = gridspec.GridSpec(nrows=2,ncols=2,figure=fig2,
left=0.25,right=0.9,top=0.9,bottom=0.25,
width_ratios=[1,2])
#根据给定的 “区域规划图” ,创建对应的坐标系实例
ax1 = fig2.add_subplot(spec2[0,0])
ax2 = fig2.add_subplot(spec2[0,1])
ax3 = fig2.add_subplot(spec2[1,0])
ax4 = fig2.add_subplot(spec2[1,1])
#展示图表
plt.show()
运行程序,效果如图:
width_ratios里的数据对调
#创建 “区域规划图” 实例
#width_ratios 设置坐标系的相对宽度
#每个坐标系的宽度 = 设定值/sum(设定值)
spec2 = gridspec.GridSpec(nrows=2,ncols=2,figure=fig2,
left=0.25,right=0.9,top=0.9,bottom=0.25,
width_ratios=[2,1])
#根据给定的 “区域规划图” ,创建对应的坐标系实例
ax1 = fig2.add_subplot(spec2[0,0])
ax2 = fig2.add_subplot(spec2[0,1])
ax3 = fig2.add_subplot(spec2[1,0])
ax4 = fig2.add_subplot(spec2[1,1])
#展示图表
plt.show()
运行程序,效果如图:
width_ratios=[2,1]或 width_ratios=[1,2]可以理解为将画布按比例划分为3份,其中第一份占其中的1份,第二份占其中的2份。
● height_ratios:表示 设置坐标系的相对高度(高)
#导入模块
%matplotlib auto
import numpy as up
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig2 = plt.figure()
#创建 “区域规划图” 实例
#height_ratios 设置坐标系的相对高度(高)
#每个坐标系的高度 = 设定值/sum(设定值)
spec2 = gridspec.GridSpec(nrows=2,ncols=2,figure=fig2,
left=0.25,right=0.9,top=0.9,bottom=0.25,
width_ratios=[1,1],
height_ratios=[2,1])
#根据给定的 “区域规划图” ,创建对应的坐标系实例
ax1 = fig2.add_subplot(spec2[0,0])
ax2 = fig2.add_subplot(spec2[0,1])
ax3 = fig2.add_subplot(spec2[1,0])
ax4 = fig2.add_subplot(spec2[1,1])
#展示图表
plt.show()
运行程序,效果如图:
height_ratios里的数据对调
#创建 “区域规划图” 实例
#height_ratios 设置坐标系的相对高度(高)
#每个坐标系的高度 = 设定值/sum(设定值)
spec2 = gridspec.GridSpec(nrows=2,ncols=2,figure=fig2,
left=0.25,right=0.9,top=0.9,bottom=0.25,
width_ratios=[1,1],
height_ratios=[1,2])
#根据给定的 “区域规划图” ,创建对应的坐标系实例
ax1 = fig2.add_subplot(spec2[0,0])
ax2 = fig2.add_subplot(spec2[0,1])
ax3 = fig2.add_subplot(spec2[1,0])
ax4 = fig2.add_subplot(spec2[1,1])
#展示图表
plt.show()
运行程序,效果如图:
height_ratios可以参照width_ratios了解。