Matplotlib与Celluloid在Jupyter notebook中异常行为相关问题咨询
问题1:第二个静态空图的原因与解决方法
原因是Jupyter Notebook的matplotlib后端默认会自动渲染当前会话中最后生成的画布对象。你代码里创建了fig画布对象后没有主动关闭,生成HTML5视频的同时,Jupyter额外输出了该画布的静态渲染结果,因为动画渲染完成后画布上没有留存的可见元素,所以显示为空图。
解决方法:在调用camera.animate()生成动画后,主动关闭当前画布即可,修改对应代码段为:
animation = camera.animate(blit = False, interval = 10) plt.close(fig) # 新增该行关闭画布 HTML(animation.to_html5_video())
问题2:动画中网格不显示的原因与解决方法
原因是celluloid的Camera.snap()只会捕获当前画布上添加的艺术家对象(比如scatter生成的散点、plot生成的线这类元素),你放在循环里的plt.grid()、plt.xlim()、plt.ylim()都属于坐标轴的属性配置,不属于独立的艺术家对象,不会被逐帧捕获。
解决方法:把所有固定的坐标轴配置统一挪到循环外,创建完坐标轴后就完成设置,不需要在每帧重复调用,修改后完整代码如下:
fig = plt.figure() ax = plt.gca() ax.set_aspect('equal') # 固定轴配置提前到循环外 plt.xlim(-3, 3) plt.ylim(-3, 3) plt.grid() camera = Camera(fig) for i in range(result.t.size): if i % 10 == 0: x = result.y[0, i] y = result.y[1, i] plt.scatter(x, y, s = 100, c = 'red') camera.snap() animation = camera.animate(blit = False, interval = 10) plt.close(fig) HTML(animation.to_html5_video())
内容的提问来源于stack exchange,提问作者SrJaimito
相关产品推荐
相关产品推荐

