如何在Matplotlib中不使用gs,通过Axes对象修改子图尺寸
在Matplotlib中不使用GridSpec修改子图尺寸的方法
问题描述
创建2×2的子图布局后,希望通过get_position和set_position方法修改其中一个子图的尺寸(例如将左上角子图高度压缩为原来的一半),但get_position返回的是不可下标修改的BBox对象,无法直接调整参数后重新设置。初始代码如下:
fig=plt.figure() ax=np.empty((2,2,),dtype=object) ax[0][0]=fig.add_subplot(2,2,1) ax[0][1]=fig.add_subplot(2,2,2) ax[1][0]=fig.add_subplot(2,2,3) ax[1][1]=fig.add_subplot(2,2,4)
解决方案
BBox对象本身不可修改,但可以通过其属性获取可编辑的位置参数,修改后再传入set_position方法,有两种常用方式:
方式1:利用bounds属性获取位置四元组
bounds会返回一个包含(left, bottom, width, height)的元组,将其转为列表后即可修改对应的尺寸参数:
# 获取当前位置参数并转为可修改的列表 pos = list(ax[0][0].get_position().bounds) # 将高度(第四个元素)改为原来的一半 pos[3] /= 2 # 设置新的位置和尺寸 ax[0][0].set_position(pos)
方式2:利用get_points()获取对角坐标
get_points()返回子图左下角和右上角的坐标数组[[x0, y0], [x1, y1]],调整右上角的y坐标即可改变子图高度:
# 获取子图的对角点坐标 points = ax[0][0].get_position().get_points() # 计算原高度并减半,重新设置右上角的y值 original_height = points[1][1] - points[0][1] points[1][1] = points[0][1] + original_height / 2 # 应用新位置 ax[0][0].set_position(points)
两种方法都可以实现子图尺寸的调整,选择哪种取决于你更习惯用位置四元组还是对角坐标来控制子图布局。
内容的提问来源于stack exchange,提问作者samman
相关产品推荐
相关产品推荐

