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

所以,我写了一个简单的代码来使用 Matplotlib 的 FuncAnimation 创建一个动画图。但是没有输出。我认为错误出在 'np.append' 函数中,因为如果我给 'animate' 函数预先制作的 x、y、z 数组,代码就可以工作。但是,我不明白为什么这不起作用!


%matplotlib notebook


import numpy as np

import mpl_toolkits.mplot3d.axes3d as p3

import matplotlib.pyplot as plt

import matplotlib.animation as animation


del_t = 0.01 ##Time-step value


x=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 time

def dx_dt(x, y, z):

    return 10*(y-x)

def dy_dt(x, y, z):

    return -x*z + 28*x - y

def 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-ordinate

def 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)/6

def 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)/6

def 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)/6


fig = plt.figure()

ax = p3.Axes3D(fig)


#Creating a line object

line, = 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 line


ani = animation.FuncAnimation(fig, animate, fargs = (x, y, z, line), interval=50, blit=False)


哆啦的时光机
浏览 231回答 1
1回答

繁星淼淼

您需要将 append 的结果保存在数组x,y和 中z。您看到它附加的原因很可能是因为您正在以交互方式测试它。但正如@hpaulj 提到的,为了您的目的,您必须将附加的数组存储在函数中。此外,您必须声明x, y, z为global反映更改以避免IndexError. 要初始化 line 对象,您可以定义一个init函数,然后i在您的FuncAnimation该文档说(重点煤矿)返回:追加:ndarrayarr 的副本,在轴上附加了值。请注意, append 不会就地发生:分配并填充一个新数组。您将不得不存储新数组# Initizlise x, y, z heredef 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 objectline, = 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python