Python matplotlib动画报错:TypeError: cannot unpack non-iterable Figure object
报错原因及解决方法:TypeError: cannot unpack non-iterable Figure object
报错原因
- 变量解包错误:代码中
fig , ax = plt.figure()这一行试图将plt.figure()的返回值拆分为两个变量,但plt.figure()仅返回一个Figure对象,无法被解包成两个变量,这是触发TypeError的直接原因。 - 数据索引逻辑错误:从文件读取的
x和y是一维numpy数组(datas[:,0]、datas[:,1]返回一维数组),但update函数中使用了x[frames,:]这种二维数组的索引方式,后续运行会引发索引越界错误。
解决方法
1. 修正Figure与Axes的创建方式
将fig , ax = plt.figure()替换为fig, ax = plt.subplots(),plt.subplots()会同时返回Figure和Axes对象,满足变量解包的需求。
2. 调整动画数据索引逻辑
由于x和y是一维数组,要实现逐步绘制的动画效果,应取前frames+1个数据点,修改update函数中的索引方式:
def update(frames): line.set_data(x[:frames+1], y[:frames+1]) return line,
3. 明确绘图上下文
改用ax.plot替代plt.plot,确保绘图操作关联到指定的Axes对象,避免上下文混淆。
修正后的完整代码
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np import matplotlib matplotlib.use('TkAgg') datas = np.loadtxt('P5data.txt', skiprows=1) x = datas[:, 0] y = datas[:, 1] def init(): ax.set_ylim(min(y), max(y)) ax.set_xlim(min(x), max(x)) return line, def update(frames): # 逐步取前frames+1个数据点,实现绘制动画 line.set_data(x[:frames+1], y[:frames+1]) return line, # 正确创建Figure和Axes对象 fig, ax = plt.subplots() line, = ax.plot([], [], lw=2) ani = animation.FuncAnimation(fig, update, init_func=init, frames=len(x), blit=True) plt.show()
内容的提问来源于stack exchange,提问作者Ander Gabarrus
相关产品推荐
相关产品推荐

