Jupyter Notebook中Matplotlib动画生成双图问题求助
解决Matplotlib动画重复显示两张图的问题
我来帮你排查下这个重复出图的问题——其实你的代码里有几个容易忽略的小细节在作祟,导致不管怎么用plt.close()或者调整单元格都没用:
- 混用全局plt接口和面向对象的ax对象:你的
init函数里用了plt.xlabel()、plt.xlim()这类全局pyplot函数,这些操作会自动创建一个新的默认图形对象,而不是复用你已经创建好的fig, ax。这就是多出一张图的核心原因,要改成用ax.set_xlabel()、ax.set_xlim()这类ax对象的专属方法。 - init函数缺少返回值:
FuncAnimation的init_func需要返回要更新的艺术家对象(哪怕是空元组),不然动画初始化时可能会触发额外渲染,导致重复出图。 - plt.close()未指定目标图形:只调用
plt.close()可能不会精准关闭你创建的fig,应该明确指定关闭这个特定的图形对象。
另外我注意到你在animate函数里把xlim和ylim设反了(init里是xlim(-1,1)、ylim(-2,2),animate里变成了ylim(-1,1)、xlim(-2,2)),如果这不是你故意的,记得调整回来。
下面是修改后的完整代码:
from matplotlib.animation import FuncAnimation from IPython.display import HTML import numpy as np # 别忘了导入numpy!你的代码里用到了np但没写导入 a_lijst = np.arange(-1,2,0.1) fig, ax = plt.subplots() x = np.arange(-1,1,0.01) def verandering(X,V,a): u = V v = -X - (a*V**3 - V) return [u,v] def euler(initx,inity,a,stapgrootte,periode): X = initx V = inity x = [] y = [] for i in range(0,periode): x.append(X) y.append(V) X += stapgrootte*verandering(x[-1],y[-1],a)[0] V += stapgrootte*verandering(x[-1],y[-1],a)[1] return x,y def init(): ax.set_xlabel('x') ax.set_ylabel('y') ax.set_xlim(-1,1) ax.set_ylim(-2,2) return (ax,) # 返回要更新的对象,确保动画初始化正确 def animate(i): ax.clear() # 这里如果是笔误就改回和init一致的lim,否则保留你的设置 ax.set_xlim(-1,1) ax.set_ylim(-2,2) for coordinaat in coordinaten: # 注意:你代码里的coordinaten变量没定义,要先赋值哦! x_i = coordinaat[0] y_i = coordinaat[1] x,y = euler(x_i,y_i,a_lijst[i],0.1,100) ax.plot(x,y) ax.set_title('a={}'.format(a_lijst[i])) return (ax,) # 同样返回更新后的对象 anim = FuncAnimation(fig, animate, init_func=init, frames=30, interval=100) plt.close(fig) # 明确关闭创建的这个fig HTML(anim.to_jshtml())
额外提醒:代码里的coordinaten变量没有定义,运行时会报错,记得先给它赋值(比如coordinaten = [(0, 0), (0.5, 0)]这类测试数据)。
内容的提问来源于stack exchange,提问作者IronicalCoffee
相关产品推荐
相关产品推荐

