如何用Matplotlib生成动画子图?ValueError报错排查
解决Matplotlib子图解包错误:ValueError: not enough values to unpack (expected 4, got 2)
问题描述
我想用Python生成一个包含4个动画的图,尝试运行以下代码时出现错误:ValueError: not enough values to unpack (expected 4, got 2)
原代码:
fig, (axF, axS, axH, axHamilt) = plt.subplots(2, 2) graphF,=axF.plot([],[]) graphS,=axS.plot([],[]) graphH,=axH.plot([],[]) graphHamilt,=axHamilt.plot([],[]) axF.set_ylim(-1.5, 1.5) axF.set_xlim(ri, rf) axF.grid() axS.set_ylim(-1.5, 1.5) axS.set_xlim(ri, rf) axS.grid() axH.set_ylim(-1.5, 1.5) axH.set_xlim(ri, rf) axH.grid() axHamilt.set_ylim(-1.5, 1.5) axHamilt.set_xlim(ri, rf) axHamilt.grid() def animate(i): graphF.set_data(r,Sevol[i]) graphS.set_data(r, Fevol[i]) graphH.set_data(r, Hevol[i]) graphHamilt.set_data(r, Hevol[i]) return graphF, graphS, graphH, graphHamilt ani = FuncAnimation(fig, animate, frames=N_plots, interval=100) plt.show()
错误原因
plt.subplots(2, 2)返回的子图对象是二维数组结构(形状为(2,2)),即[[ax1, ax2], [ax3, ax4]]。你直接用(axF, axS, axH, axHamilt)去解包,相当于尝试从一个包含2个元素(两行子图)的结构里取出4个变量,自然会触发"值不足"的错误。
解决方案
有两种简单的修复方式:
方法1:将子图数组扁平化
把二维的子图数组转成一维后再解包:
fig, axes = plt.subplots(2, 2) axF, axS, axH, axHamilt = axes.flatten()
方法2:按二维结构解包
直接匹配子图的二维嵌套结构来解包:
fig, ((axF, axS), (axH, axHamilt)) = plt.subplots(2, 2)
修正后的完整代码示例
以方法2为例,修正后的代码如下:
import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 提前定义示例所需变量 ri, rf = 0, 10 r = range(ri, rf) Sevol = [[0]*len(r) for _ in range(10)] Fevol = [[0]*len(r) for _ in range(10)] Hevol = [[0]*len(r) for _ in range(10)] N_plots = 10 fig, ((axF, axS), (axH, axHamilt)) = plt.subplots(2, 2) graphF,=axF.plot([],[]) graphS,=axS.plot([],[]) graphH,=axH.plot([],[]) graphHamilt,=axHamilt.plot([],[]) axF.set_ylim(-1.5, 1.5) axF.set_xlim(ri, rf) axF.grid() axS.set_ylim(-1.5, 1.5) axS.set_xlim(ri, rf) axS.grid() axH.set_ylim(-1.5, 1.5) axH.set_xlim(ri, rf) axH.grid() axHamilt.set_ylim(-1.5, 1.5) axHamilt.set_xlim(ri, rf) axHamilt.grid() def animate(i): graphF.set_data(r,Sevol[i]) graphS.set_data(r, Fevol[i]) graphH.set_data(r, Hevol[i]) graphHamilt.set_data(r, Hevol[i]) return graphF, graphS, graphH, graphHamilt ani = FuncAnimation(fig, animate, frames=N_plots, interval=100) plt.show()
内容的提问来源于stack exchange,提问作者User8563
相关产品推荐
相关产品推荐

