如何让函数返回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
相关产品推荐
相关产品推荐

