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

如何调整Matplotlib子图尺寸:增大左侧子图宽度适配右侧表格

调整Matplotlib子图与表格轴的宽度比例

当前代码依赖add_subplot(221)、add_subplot(223)、add_subplot(122)的默认布局,左右列宽度均分,无法实现左侧子图加宽、右侧表格轴收窄的需求。以下是两种可行的调整方案:

方案一:使用GridSpec自定义布局

通过matplotlib.gridspec.GridSpec精确控制列宽比例,给左侧分配更大宽度:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import pandas as pd

# 假设以下变量已预先定义:msle_train, msle_test, y_data, y_pred_train, y_pred_test, error_train, error_test

fig = plt.figure(figsize=(18,5))
# 定义2行2列网格,设置左右列宽度比例为3:1(可根据需求调整)
gs = gridspec.GridSpec(2, 2, width_ratios=[3, 1])

ax1 = fig.add_subplot(gs[0, 0])  # 第一行左侧子图
ax2 = fig.add_subplot(gs[1, 0])  # 第二行左侧子图
ax3 = fig.add_subplot(gs[:, 1])  # 右侧跨两行的表格轴
ax3.axis('off')

# 绘制表格
data = pd.DataFrame({'metrics': ['MSLE train', 'msle_test', 'asdsad'],
              'values': [0.43, 0.52, 0.54]})
ax3.table(cellText=data.values, colLabels=data.columns, loc='center')

# 绘制左侧子图内容
fig.suptitle(f'Train MSLE: {msle_train}, Test MSLE: {msle_test}') 
y_data.plot(label='Original data', ax=ax1, c='blue')
y_pred_train.plot(ax=ax1, c='orange')
y_pred_test.plot(ax=ax1, c='orange', linestyle='--')
ax1.legend()

error_train.plot(label='Train error', ax=ax2)
error_test.plot(label='Test error', ax=ax2, linestyle='--')
ax2.legend()

plt.tight_layout()  # 自动优化布局,避免元素重叠
plt.show()

关键说明

  • width_ratios=[3,1]:设置左右列的宽度占比,可根据实际需求修改数值(如4:1、5:2等)
  • gs[:,1]:让右侧轴占据两行高度,与原布局的122效果一致
  • plt.tight_layout():自动调整子图间距,防止标题、标签等元素重叠

方案二:使用subplots直接设置宽度比例

通过plt.subplots的width_ratios参数直接定义列宽,更简洁:

import matplotlib.pyplot as plt
import pandas as pd

# 假设以下变量已预先定义:msle_train, msle_test, y_data, y_pred_train, y_pred_test, error_train, error_test

# 创建2行2列子图,设置宽度比例3:1,隐藏右下角不需要的轴
fig, ((ax1, ax3), (ax2, empty_ax)) = plt.subplots(2, 2, figsize=(18,5), width_ratios=[3,1])
empty_ax.axis('off')
ax3.axis('off')

# 绘制表格
data = pd.DataFrame({'metrics': ['MSLE train', 'msle_test', 'asdsad'],
              'values': [0.43, 0.52, 0.54]})
ax3.table(cellText=data.values, colLabels=data.columns, loc='center')

# 绘制左侧子图内容
fig.suptitle(f'Train MSLE: {msle_train}, Test MSLE: {msle_test}') 
y_data.plot(label='Original data', ax=ax1, c='blue')
y_pred_train.plot(ax=ax1, c='orange')
y_pred_test.plot(ax=ax1, c='orange', linestyle='--')
ax1.legend()

error_train.plot(label='Train error', ax=ax2)
error_test.plot(label='Test error', ax=ax2, linestyle='--')
ax2.legend()

plt.tight_layout()
plt.show()

关键说明

  • width_ratios=[3,1]:直接定义左右列宽度比例
  • 右下角的empty_ax被隐藏,避免多余元素干扰布局

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:48:38