为了账号安全,请及时绑定邮箱和手机立即绑定

在 Matplotlib FuncAnimation 中制作动画时难以使用 append 函数

在 Matplotlib FuncAnimation 中制作动画时难以使用 append 函数

哆啦的时光机 2021-12-08 10:34:55
所以,我写了一个简单的代码来使用 Matplotlib 的 FuncAnimation 创建一个动画图。但是没有输出。我认为错误出在 'np.append' 函数中,因为如果我给 'animate' 函数预先制作的 x、y、z 数组,代码就可以工作。但是,我不明白为什么这不起作用!%matplotlib notebookimport numpy as npimport mpl_toolkits.mplot3d.axes3d as p3import matplotlib.pyplot as pltimport matplotlib.animation as animationdel_t = 0.01 ##Time-step valuex=np.array([0.0])y=np.array([10.0])z=np.array([0.0])#These functions give how (x, y, z) co-ordinate#changes with timedef dx_dt(x, y, z):    return 10*(y-x)def dy_dt(x, y, z):    return -x*z + 28*x - ydef dz_dt(x, y, z):    return x*y-(8/3)*z#Runge-Kutta Method for numerical solution of differential equations#These functions give next (x, y, z) co-ordinatedef next_xpt(x, y, z):    k1 = dx_dt(x, y, z) * del_t    k2 = dx_dt(x + k1/2, y, z) * del_t    k3 = dx_dt(x + k2/2, y, z) * del_t    k4 = dx_dt(x + k3, y, z) * del_t    return x + (k1 + 2*k2 + 2*k3 + k4)/6def next_ypt(x, y, z):    k1 = dy_dt(x, y, z) * del_t    k2 = dy_dt(x, y + k1/2, z) * del_t    k3 = dy_dt(x, y + k2/2, z) * del_t    k4 = dy_dt(x, y + k3, z) * del_t    return y + (k1 + 2*k2 + 2*k3 + k4)/6def next_zpt(x, y, z):    k1 = dz_dt(x, y, z) * del_t    k2 = dz_dt(x, y, z + k1/2) * del_t    k3 = dz_dt(x, y, z + k2/2) * del_t    k4 = dz_dt(x, y, z + k3) * del_t    return z + (k1 + 2*k2 + 2*k3 + k4)/6fig = plt.figure()ax = p3.Axes3D(fig)#Creating a line objectline, = ax.plot3D([0.0],[10.0],[0.0],'-b') ax.set_xlim3d(-30,30)ax.set_xlabel("X")ax.set_ylim3d(-30,30)ax.set_ylabel("Y")ax.set_zlim3d(-30,30)ax.set_zlabel("Z")ax.set_title("Lorenz Strange Attractor")def animate(i, x, y, z, line):    np.append(x, next_xpt(x[i], y[i], z[i]))    np.append(y, next_ypt(x[i], y[i], z[i]))    np.append(z, next_zpt(x[i], y[i], z[i]))    line.set_data(x[:i+1],y[:i+1])    line.set_3d_properties(z[:i+1])    return lineani = animation.FuncAnimation(fig, animate, fargs = (x, y, z, line), interval=50, blit=False)
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

您需要将 append 的结果保存在数组x,y和 中z。您看到它附加的原因很可能是因为您正在以交互方式测试它。但正如@hpaulj 提到的,为了您的目的,您必须将附加的数组存储在函数中。此外,您必须声明x, y, zglobal反映更改以避免IndexError. 要初始化 line 对象,您可以定义一个init函数,然后i在您的FuncAnimation

文档说(重点煤矿)

返回:追加:ndarray

arr 的副本,在轴上附加了值。请注意, append 不会就地发生:分配并填充一个新数组

您将不得不存储新数组

# Initizlise x, y, z here


def init():

    line.set_data([], [])

    line.set_3d_properties([])

    return line,


# dx_dt, dy_dt, dz_dt etc. functions here 


fig = plt.figure()

ax = p3.Axes3D(fig)


#Creating a line object

line, = ax.plot3D([0.0],[10.0],[0.0],'-b') 


# Setting axes limits here    


def animate(i):

    global x, y, z

    x = np.append(x, next_xpt(x[i], y[i], z[i]))

    y = np.append(y, next_ypt(x[i], y[i], z[i]))

    z = np.append(z, next_zpt(x[i], y[i], z[i]))

    line.set_data(x[:i+1],y[:i+1])

    line.set_3d_properties(z[:i+1])

    return line,


ani = animation.FuncAnimation(fig, animate, init_func=init, interval=50, blit=False)


查看完整回答
反对 回复 2021-12-08
  • 1 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信