You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib Subfigures:添加ylabel后如何保持子图尺寸一致?

Matplotlib添加ylabel后Subfigure内子图缩小的问题

问题场景

我需要创建满足以下要求的绘图布局:

  • 整体为1行3列的3个subfigure
  • 每个subfigure内部包含3行2列的方形子图(subplot)
  • 整体figure带有总标题,每个subfigure有独立标题,首行的每个subplot也需添加标题
  • 给第一列的所有subplot添加ylabel

但实际实现时遇到问题:给最左侧子图添加ylabel后,第一个subfigure内的所有子图会被横向缩小,以维持三个subfigure的整体尺寸一致;不添加ylabel时,三个subfigure内的子图大小完全正常。

示例代码

以下代码可复现两种效果,通过修改add_ylabel开关切换:

import matplotlib.pyplot as plt

# 控制是否添加ylabel,改为False查看正常缩放效果
add_ylabel = True

# 创建整体figure,关闭自动布局以复现问题
fig = plt.figure(constrained_layout=False, figsize=(12, 6))
# 创建1行3列的subfigure,宽度比例一致
subfigs = fig.subfigures(nrows=1, ncols=3, width_ratios=[1, 1, 1])

# 设置整体总标题
fig.suptitle("整体总标题", fontsize=14)

# 遍历每个subfigure创建内部子图
for idx, subfig in enumerate(subfigs):
    subfig.suptitle(f"子图组 {idx+1}", fontsize=12)
    # 每个subfigure内创建3行2列的subplot
    axs = subfig.subplots(nrows=3, ncols=2)
    
    # 给首行subplot添加标题
    for col in range(2):
        axs[0, col].set_title(f"子标题 {idx+1}-{col+1}")
    
    # 给第一个subfigure的第一列subplot添加ylabel
    if idx == 0 and add_ylabel:
        for row in range(3):
            axs[row, 0].set_ylabel(f"Y轴 {row+1}")
    
    # 设置所有subplot为方形比例
    for ax in axs.flat:
        ax.set_aspect('equal')

plt.show()

效果对比

  • 不添加ylabel时:三个子图组内的方形子图尺寸完全一致,布局整齐紧凑,所有子图保持方形比例。
  • 添加ylabel后:第一个子图组左侧因ylabel占用空间,内部子图被横向压缩,尺寸明显小于另外两个子图组的子图,破坏了整体布局的一致性。

解决方法

方法1:启用自动约束布局

在创建figure时开启constrained_layout=True,让Matplotlib自动调整subfigure和subplot的布局,既能容纳ylabel,又能保证所有subplot的尺寸一致:

fig = plt.figure(constrained_layout=True, figsize=(12, 6))

方法2:调整第一个subfigure的宽度比例

创建subfigures时,给第一个子图组设置更大的宽度比例,预留出ylabel的空间:

subfigs = fig.subfigures(nrows=1, ncols=3, width_ratios=[1.2, 1, 1])

可根据ylabel的长度调整比例数值,确保内部子图不会被压缩。

方法3:统一设置subfigure的左边距

给所有subfigure统一设置左边距,避免只有第一个子图组被压缩:

# 在所有子图创建完成后添加
for subfig in subfigs:
    subfig.subplots_adjust(left=0.15)

left参数可根据实际需求调整,确保ylabel有足够显示空间。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:05:22