子图的布局

           当带有标题的多个子图并排显示时,多个子图会因区域过于紧凑而出现标题和坐标轴之间相互重叠的问题,而且子图元素的摆放过于紧凑,也影响用户的正常查看。matplotlib 中提供了一些调整子图布局的方法,包括约束布局、紧密布局和自定义布局,通过这些方法可以合理布局多个子图。

1、约束布局

        约束布局是指通过一系列限制来确定画布中元素的位置的方式,它预先会确定一个元素的绝对定位,之后以该元素的位置为基点对其他元素进行绝对定位,从而灵活地调整元素的位置。matplotlib 在绘制多子图时默认并未启用约束布局,它提供了两种方式启用约束布局:第种方式是使用subplots0或figure0函数的constrained _layout 参数;第二种方式是修改figure.constrained_layout.use配置项。具体内容如下。
(1)使用constrained _layout 参数
matplotlib使用subplots0或figure0函数创建子图或画布时,可以将constrained _layout参数的值设为 True,进而调整子图元素的布局,示例代码如下:

plt.subplots(constrained layout-True)

(2)修改 figure.constrained layout.use 配置项
matplotlib可以通过rcParams 字典或r0函数修改 figure.constrained _layout.use 配置项的值为 True,进而调整子图元素的布局,示例代码如下:

plt.rcParams['figure.constrained layout.use'] = True

另外,matplotlib 还可以修改以下配置项来调整子图之间的距离。
 figure.constrained layout.w_pad/h_pad:表示绘图区域的内边距,默认为0.04167·

figure.constrained_layout.wspace/ hspace:表示子图之间的空隙,默认为0.02。

需要注意的是,约束布局仅适用于调整刻度标签、轴标签、标题和图例的位置,而不会调整子图其他元素的位置。因此,使用约束布局后的子图之间仍然会出现图表元素被裁剪或重叠的问题。


2、紧密布局

matplotlib 中紧密布局与约束布局相似,它采用紧凑的形式将子图排列到画布中,仅适用于刻度标签、坐标轴标签和标题位置的调整,
pyplot中提供了两种实现紧密布局的方式:

第一种方式是调用tight_Jayout0函数

第二种方式是修改figureautolayoutrcParam配置项。关于紧密布局的两种实现方式的介绍如下。

(1)调用 tight_layout0函数
matplotlib在1.1版本中引人了 tight_layout0函数,通过该函数调整子图的内边距及子图的间隙,使子图能适应画布的绘图区域。tight_laout0函数的语法格式如下:

tight layout(pad=1.08,h pad=None,w pad=None,rect=None)


该函数的参数含义如下。
pad :表示画布边缘与子图边缘之间的空白区域的大小,默认为 1.08
h_pad,w_pad:表示相邻子图之间的空白区域的大小。’rect:表示调整所有子图位置的矩形区域的四元组 (etbottom,ght top),默认为(0,0,11)需要注意的是,当pad 参数设为0时,空白区域的文本会出现被裁剪的现象。之所以出现文本部分缺失的情况,可能是因为算法错误或受到算法的限制。因此,官方建议 pad参数的取值应至少大于0.3。
(2)修改fgureautolayoutrcParam配置项
pyplot可以通过reParams 字典或re0函数修改gure.autolayoutrcParam 配置项的值为True,使子图元素适应画布。

3、自定义布局

matplotlib 的gridspec 模块是专门指定画布中子图位置的模块,该模块中包含一个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:表示列数。
fgure:表示布局的画布
·left,bottom,right,top :表示子图的范围。
wspace:表示子图之间预留的宽度量。
·hspace: 表示子图之间预留的高度量。

GridSpec 类对象的使用方式与数组的使用方式相似,采用索引或切片的形式访问每个布局元素。此外,matplotlib 中还为Figure对象提供了快速添加布局结构的方法add gridspec0。
下面分别是使用两种方式创建自定义的布局结构。

(1)使用GridSpec0方法创建子图的布局结构这种方式需要创建子图和 GridSpec类对象,之后在调用add_subplot0 方法时传人GridSpec 类对象即可

(2)使用add_gridspec0 方法向画布添加布局结构这种方式需要创建画布和GridSpec 类对象,之后在调用add_subplot0方法添加子图时传人一个 GridSpec 类对象即可

实操

利用自定义布局的GridSpec实例,在画布上创建如图所示的坐标系实例(见运行结果展示图)

%matplotlib notebook
import matplotlib.pyplot as plt
#使用add_girdspec()的方法
import matplotlib.gridspec as gridspec


#创建画布实例
fig =plt.figure()
#规划画布布局
gs = fig.add_gridspec(3,4)

#创建“区域规划图”实例
ax_one =fig.add_subplot(gs[0,:])
ax_two =fig.add_subplot(gs[1,:2])
ax_three =fig.add_subplot(gs[1,2:])
ax_for =fig.add_subplot(349 ,polar=True)#设置为极坐标系
ax_five =fig.add_subplot(gs[2,1:])
#调整子图之间的距离
plt.tight_layout()
plt.show()

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值