如何调整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
相关产品推荐
相关产品推荐

