Asmendeus 发表于 2021-12-23 23:15:35

matplotlib animation动画无法清除之前帧的图像

本帖最后由 Asmendeus 于 2021-12-23 23:39 编辑

函数是在管口处x方向流出,y方向上做正弦振动,在z方向上受重力的水流
问题是 对于第n帧的动画,第n帧以前的所有图像都被保留了下来,但是我希望它在第n帧时只显示第n帧的图像

import builtins
from matplotlib import animation
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation

#时间单位ms, 长度单位mm
#t大概在500ms内, z大概在900mm内, x大概在300mm内, y大概在100mm内

#运动参数
Vx0 = 0.75               #管口水在x方向的速率
Vy0 = 0.25               #管口水在y方向最大的速率
f = 30                   #振动频率
w = 2*np.pi * f / 1000   #将f转化为圆频率
g = 9.8 * 10**(-3)       #重力加速度
t0 = 1000                #t0为拍照时刻,1秒后水流稳定再开始拍照

#初始化
fig = plt.figure()
ax1 = Axes3D(fig)
plt.xlim((0,400))
plt.ylim((-300,300))
ax1.set_zlim(-1000,0)

#函数图像
def get_line():
    global t0
    t0 += 1000/29
    #每1/30秒取样一次
    t = np.linspace(0,1000,500, endpoint=False)
    #t用来生成轨迹, 是从管口出发运动到此拍照时刻的时间
    x = Vx0 * t
    y = - Vy0 * np.sin(w*(t0-t)) * t + Vy0 * np.cos(w*(t0-t)) / w
    z = - g * t**2 / 2
    line = np.stack((x,y,z),axis=1)
    print(line)
    return line

def update(i):

    label = 'timestep {0}'.format(i)
    ax1.set_xlabel(label)

    line = get_line()
    ax1.plot3D(line[:, 0], line[:, 1], line[:, 2], 'blue')
    return ax1

anim = FuncAnimation(fig, update, frames=np.arange(0, 50), interval=2, blit=False, repeat=False)
plt.show()

Asmendeus 发表于 2021-12-23 23:30:38

37行line是后来用来测试x,y,z是否更新的,忘记删了{:10_258:}

Asmendeus 发表于 2021-12-23 23:38:26

已解决,在update里加了一个axe.clear(){:10_306:}
页: [1]
查看完整版本: matplotlib animation动画无法清除之前帧的图像