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

如何让函数返回matplotlib的ax对象用于绘图,解决多子图合并异常问题

问题解决方法

核心原因

make_plot函数内部每次调用都会通过plt.figure新建独立画布,不会复用plot_all中预先创建的大画布和子图实例,导致预先占好的子图位置留空,每次绘图都生成单独的新图。

修改方案

调整make_plot逻辑,把已经创建好的子图对象作为参数传入,不在函数内部新建画布和子图即可,修改后运行即可得到预期的多子图合并效果,不会再出现空坐标轴和单独生成的图片。

修改后完整可运行代码

import matplotlib.pyplot as plt
import math


def make_plot(ax, y_true, y_pred):
    # 直接用传入的ax绘图,不再新建画布和子图
    ax.plot(y_true, y_pred, 'o')
    ax.set_xlabel('Observed', size=14)
    ax.set_ylabel('Predicted', size=14)
    ax.tick_params(labelsize=12)
    return ax
    

def plot_all(y_true_all, y_pred_all, fig_save_folder, fig_name, plot_size=(4,4), num_plots_x = 2):
    num_plots_y = math.ceil(len(y_true_all)/num_plots_x)   # y方向子图数量
    # 预先创建大画布
    plt.figure(figsize=(plot_size[0]*num_plots_x, plot_size[1]*num_plots_y))
    
    for i in range(len(y_true_all)):
        # 生成子图对象
        ax = plt.subplot(num_plots_y, num_plots_x, i+1)        
        y_true = y_true_all[i]
        y_pred = y_pred_all[i]
        # 传入现有子图绘图
        make_plot(ax, y_true, y_pred) 
    
    plt.tight_layout()     
    plt.savefig(f'{fig_save_folder}/{fig_name}.png')
    plt.show()   
    

# 测试代码
y_true_all = [[1, 2, 3], [1, 2, 3]]
y_pred_all = [[1.1, 2, 3.1], [1, 1.9, 3]]
fig_save_folder = './result'
fig_name = 'test'
plot_all(y_true_all, y_pred_all, fig_save_folder, fig_name, plot_size=(4,4), num_plots_x = 2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:06:04