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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:20:42