在subplot中绘制imshow类图表异常:仅显示一个图且报ValueError
解决Matplotlib子图中绘制plot_multivariate_DM_test图表的报错问题
问题描述
我尝试在Matplotlib的subplot子图中绘制由plot_multivariate_DM_test函数生成的imshow类图表。单独绘制单个图表时功能正常,但绘制4个图表时仅显示一个,同时抛出错误:ValueError: x, y, and format string must not be None。
原始代码如下:
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(8,8)) ax1.set_title('Zone 1') ax1.plot(plot_multivariate_DM_test(df['Price_REG1'].iloc[17544:], predictions_22_1, norm=1, title='DM test', savefig=False, path='')) ax2.set_title('Zone 2') ax2.plot(plot_multivariate_DM_test(df['Price_REG2'].iloc[17544:], predictions_22_2, norm=1, title='DM test', savefig=False, path='')) ax3.set_title('Zone 3') ax3.plot(plot_multivariate_DM_test(df['Price_REG3'].iloc[17544:], predictions_22_3, norm=1, title='DM test', savefig=False, path='')) ax4.set_title('Zone 4') ax4.plot(plot_multivariate_DM_test(df['Price_REG4'].iloc[17544:], predictions_22_4, norm=1, title='DM test', savefig=False, path='')) fig.tight_layout() plt.show()
问题原因
- 误用
ax.plot()方法:plot_multivariate_DM_test是独立的绘图函数,内部已完成图表创建、imshow绘制逻辑,不会返回ax.plot()所需的x/y数据(返回值大概率为None),直接触发参数错误。 - 函数默认使用当前活动轴:多次调用时后续绘图会覆盖之前的内容,最终仅保留最后一次的绘图结果。
解决方案
通过plt.sca()将指定子图轴设为当前活动轴,让plot_multivariate_DM_test在目标子图上绘图,避免冲突。修正后的代码如下:
import matplotlib.pyplot as plt fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(8,8)) # 绘制Zone 1子图 plt.sca(ax1) ax1.set_title('Zone 1') plot_multivariate_DM_test(df['Price_REG1'].iloc[17544:], predictions_22_1, norm=1, title='', savefig=False, path='') # 绘制Zone 2子图 plt.sca(ax2) ax2.set_title('Zone 2') plot_multivariate_DM_test(df['Price_REG2'].iloc[17544:], predictions_22_2, norm=1, title='', savefig=False, path='') # 绘制Zone 3子图 plt.sca(ax3) ax3.set_title('Zone 3') plot_multivariate_DM_test(df['Price_REG3'].iloc[17544:], predictions_22_3, norm=1, title='', savefig=False, path='') # 绘制Zone 4子图 plt.sca(ax4) ax4.set_title('Zone 4') plot_multivariate_DM_test(df['Price_REG4'].iloc[17544:], predictions_22_4, norm=1, title='', savefig=False, path='') fig.tight_layout() plt.show()
说明
plt.sca(ax)用于切换当前活动轴到指定子图,确保绘图操作在目标区域进行。- 将函数的
title参数设为空字符串,避免子图标题与函数内置标题重复。
内容的提问来源于stack exchange,提问作者user20050294
相关产品推荐
相关产品推荐

