Как сделать изменение переменных в анимации. Функция Funcimation в Python? - PullRequest
0 голосов
/ 20 марта 2019

Я на самом деле работаю над проектом Python, где мне нужно анимировать изменения во времени концентрации, для этого мне нужны значения моей концентрации в момент времени t-1 для расчета концентрации в момент времени t.

Я бы хотел, чтобы функция "animate" использовала новые значения n0 и n1 при вызове. В настоящее время он использует только те же значения n0 и n1, которые я объявил в моих начальных условиях, и не учитывает изменения, которые он вносит в n0 и n1 во время первого графика.

Вот пример моего кода (K, L и M - постоянные числа с плавающей запятой):

# Initial conditions

n0 = f(X)
n1 = n0.copy()

n1[1:-1] = K * (n0[0:-2] - 2 * n0[1:-1] + n0[2:]) - L * (n0[2:] - n0[:-2]) + M * n0[1:-1]
n0 = n1.copy()

# Animation


fig = plt.figure()
ax = plt.axes(xlim=(-0.5, 1.3), ylim=(min(f(X)), max(f(X))), xlabel="x", ylabel="n", title="n en fonction de x")
line, = ax.plot([], [], lw=2)
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)

def init():
    time_text.set_text('')
    line.set_data([],[])
    return line, time_text

def animate(i,n0,n1):
    n1[1:-1] = K * (n0[0:-2] - 2 * n0[1:-1] + n0[2:]) - L * (n0[2:] - n0[:-2]) + M * n0[1:-1]
    n0 = n1.copy()
    t = i * dt
    time_text.set_text('time = %f ms' % (t * 1000))
    y = n1
    line.set_data(X, y)
    return line, time_text


ani = animation.FuncAnimation(fig, animate, init_func=init, frames=nt, blit=True, interval=1, repeat=False, fargs=(n0, n1))

plt.show()

Надеюсь, вы сможете мне помочь, потому что я новый пользователь анимации. Фанканизация, и я не все понимаю в этом.

1 Ответ

0 голосов
/ 20 марта 2019

Довольно грубый способ достичь желаемого результата - использовать глобальную переменную

Fmin2 = 0
Fmin1 = 1

fig,ax = plt.subplots(figsize=(4,4))
ax.set_xlim(0,200)
ax.set_ylim(0,200)
line, = ax.plot([], [], 'ro')
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)

def init():
    global Fmin2,Fmin1
    Fmin2 = 0
    Fmin1 = 1
    time_text.set_text('')
    line.set_data([],[])
    return line, time_text

def animate(i):
    global Fmin2,Fmin1
    Fn = Fmin1+Fmin2
    Fmin2 = Fmin1
    Fmin1 = Fn
    time_text.set_text('i={:d}'.format(i))
    line.set_data([Fmin1],[Fn])
    return line, time_text


ani = animation.FuncAnimation(fig, animate, init_func=init, frames=10, blit=True)
plt.show()

enter image description here

Более чистым способом было бы интегрировать анимацию в класс, и иметь n0 и n1, являющихся членами этого класса, которые обновляются в функции animate(self, i).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...