一,约束布局
约束布局是通过确定画布中一个元素的绝对位置后以该元素的位置为基点来对其他元素进行绝对定位,从而灵活的调整元素的位置。
matplotlib在绘制多子图时默认并未启用约束布局,它提供了两种方式启用约束布局:
第一种方式是使用subplots( )或 figure( )函数的constrained_layout 参数;
第二种方式是修fgure.constrained_layout.use配置项。
1.1 ,使用constrained_layout参数来约束布局
启动约束布局
plt.subplots(constrained_layout=True)
1.2 ,修改figure.constrained_layout.use配置项
plt.rcParams['figure.constrained_layout.use'] = True
1.3, 此外,Figure类对象还可以提供以下方法使用和设置约束布局。
set_constrained_layout( ):设置是否使用约束布局,是figure.constrained_layout.use指定的值
set_constrained_layout_pads( ):设置子图的内边距
且约束布局仅适用于调整刻度标签,轴标签,标题和图例的位置,其他元素的位置不会调整,且可能会出现子图的重叠(如下图)
当不启用约束布局时
import matplotlib.pyplot as plt
#绘制子图
fag, axs = plt.subplots(2, 2) #只绘制2行2列的子图
ax_one = axs[0,0]
ax_one.set_title('Title')
ax_tow = axs[0,1]
ax_tow.set_title('Title')
ax_thr = axs[1,0]
ax_thr.set_title('Title')
ax_fou = axs[1,1]
ax_fou.set_title('Title')
plt.show()
运行结果如下:
当在subplots()参数中添加 constrained_layout=True 时
fag, axs = plt.subplots(2, 2 ,constrained_layout=True)
运行结果如下
二,紧密布局
紧密布局与约束布局相似,它采用紧凑的形式将子图排列到画布中,仅适用
于刻度标签、坐标轴标签和标题位置的调整。
2.1,pyplot 中提供了两种实现紧密布局的方式:
2.1.1第一种方式是调用tight_layout( )函数
tight_layout(pad=1.08,h_pad=None,w_pad=None,rect=None)
其中,pad:表示画布与子图边缘之间的空白区域的大小,默认为1.08
h_pad, w_pad: 表示相邻子图之间的空白区域大小
rect:表示调整所以子图位置的矩形区域的四元组(left,bottom,right,top),默认为 (0,0,1,1) (注意,pad参数不要超过0.3,否则会出现裁剪或重叠的情况)
2.1.2第二种方式是修改figure.autolayoutrcParam配置项
plt.rcParams['figure.autolayoutrcParam'] =True
把subplots()参数中的 'constrained_layout=True' 单独拿出来用tight_layout()函数来调整子图之间的距离,解决子图之间的重叠问题
代码如下:
#导入模块
import matplotlib.pyplot as plt
fag, axs = plt.subplots(2, 2) #绘制2行2列的子图
ax_one = axs[0,0]
ax_one.set_title('Title')
ax_tow = axs[0,1]
ax_tow.set_title('Title')
ax_thr = axs[1,0]
ax_thr.set_title('Title')
ax_fou = axs[1,1]
ax_fou.set_title('Title')
#调整子图间的距离
plt.tight_layout(pad=0.4, #边缘距离
w_pad=1, #左右间距
h_pad=3) #上下间距
plt.show()
运行结果如下:
三 ,自定义布局
matplotlib的gridspee模块是专门指定画布中子图位置的模块,该模块中包含一个GridSpcc 类,通过显式地创建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:表示子图之间预留的高度量。
3.1,使用GridSpec()方法创建子图的布局结构
创建子图和GridSpec类对象后,在gridspec.GridSpec( )中向画布添加布局结构
#导入模块
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#创建画布实例
fig_1 = plt.figure()
#创建“区域规划图”
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()
创建的 子图布局如下
3.2,使用GridSpec( )方法创建子图的布局结构
这种方式需要创建子图和GridSpec类对象,之后在调用add_subplot( )方法时传入GridSpec类对象即可,具体示例如下:
fig3 = plt.figure()
gs = fig3.add_gridspec(3,3) #绘制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]')
其中,add_subplot()函数内的子图位置大小设置 ([行,列])
(:)取全部 ,且是后取
(- )不是负数,是反方向,倒序
set_title():表示标题
创建的 子图布局如下