如何在Python鼓振动Matplotlib 3D动画中固定z轴?
固定3D鼓振动动画的Z轴
我想用Python制作鼓振动的3D动画,但遇到Z轴零点持续移动的问题,请问如何固定Z轴?
现有代码
fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) z=sol[0] def init(): surf,=ax.plot_surface(xv,yv,z0) ax.set_xlim(0,1) ax.set_ylim(0,1) #ax.set_zlim3d(-1,1) ax.set_zlim(-1,1) return surf def animate(i): u=add_boundry(z[i+1]) ax.clear() surf=ax.plot_surface(xv, yv, u) return surf anim = FuncAnimation(fig, animate,frames=200, interval=200, blit=False) anim.save('drum.gif', writer='ffmpeg')
解决方法
问题根源是animate函数里的ax.clear()——这会清空所有坐标轴配置,包括你在init里设置的Z轴范围。每次重绘曲面后,Matplotlib会自动缩放Z轴适配当前帧的数据,导致零点不断偏移。
方案1:复用曲面对象更新数据(更高效)
不要每次都清除坐标轴,而是复用初始创建的曲面对象,直接更新它的Z数据:
fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) z=sol[0] # 初始化曲面并保存对象 surf = ax.plot_surface(xv, yv, z0) ax.set_xlim(0,1) ax.set_ylim(0,1) ax.set_zlim(-1,1) def animate(i): u=add_boundry(z[i+1]) # 更新曲面的Z轴数据 surf.set_zdata(u) return surf, anim = FuncAnimation(fig, animate, frames=200, interval=200, blit=True) anim.save('drum.gif', writer='ffmpeg')
这个方案还能开启blit=True提升动画性能,因为只更新变化的部分。
方案2:每次重绘后重置坐标轴范围
如果必须保留ax.clear(),就在每次重绘曲面后重新设置所有坐标轴范围:
def animate(i): u=add_boundry(z[i+1]) ax.clear() surf=ax.plot_surface(xv, yv, u) # 重新设置坐标轴范围,固定Z轴 ax.set_xlim(0,1) ax.set_ylim(0,1) ax.set_zlim(-1,1) return surf
内容的提问来源于stack exchange,提问作者afshin
相关产品推荐
相关产品推荐

