Моя анимация не отображается должным образом

avatar
Daniel Daza
8 апреля 2018 в 01:31
56
1
0

Проблема

Мне нужна плавная анимация, но она рисуется покадрово. Код работает в Jupyter Notebook.

Вот библиотеки

import numpy as np
from matplotlib import pyplot as plt
from scipy import signal as sp

Создание функций для свертки

t_ini=0
t_final = 11
dt=0.1
t = np.arange(t_ini,t_final,dt)
expo = np.exp(-t)*np.piecewise(t,t>=0,[1,0])
t1 = np.arange(0,10,0.1)
s = np.sin(t1)
conv_=sp.convolve(s,expo,'full')
n_conv=np.arange(min(t1)+min(t),max(t1)+max(t)+0.1,0.1)
y = [0] * len(conv_)
t2 = [0] * len(n_conv)

Вот график

i = 0
for x in n_conv:

    y[i] = conv_[i]
    plt.cla()
    t2[i] = n_conv[i]
    plt.plot(t2,y)
    plt.show()
    plt.pause(0.5)

    i = i+1
Источник

Ответы (1)

avatar
Mr. T
8 апреля 2018 в 03:36
0

matplotlib обеспечивает, например, ArtistAnimation, который позволяет бесшовную анимацию предварительно рассчитанных графиков. Я просто добавил пару строк в ваш код. Единственное, что я изменил, это использовать enumerate для улучшения вашего кода

import numpy as np
from matplotlib import pyplot as plt
from scipy import signal as sp
import matplotlib.animation as anim

t_ini=0
t_final = 11
dt=0.1
t = np.arange(t_ini,t_final,dt)
expo = np.exp(-t)*np.piecewise(t,t>=0,[1,0])
t1 = np.arange(0,10,0.1)
s = np.sin(t1)
conv_=sp.convolve(s,expo,'full')
n_conv=np.arange(min(t1)+min(t),max(t1)+max(t)+0.1,0.1)
y = [0] * len(conv_)
t2 = [0] * len(n_conv)

#prepare figure for display
fig = plt.figure()
ax = plt.axes()

#create list to collect graphs for animation
img = []
for i, x in enumerate(n_conv):

    y[i] = conv_[i]
    t2[i] = n_conv[i]
    #append new graphs to  list
    newpic, = ax.plot(t2, y, c= "blue")
    img.append([newpic])

#animate the list of precalculated graphs
ani = anim.ArtistAnimation(fig, img, interval = 50)
plt.show()

Вывод:

enter image description here

Daniel Daza
8 апреля 2018 в 18:02
0

что-то там не так, просто дайте мне пустой график

Mr. T
8 апреля 2018 в 18:33
0

Хм. Я просто вставил этот код в свою IDE, и он анимировал кривую. Какая у вас версия matplotlib и ваш бэкенд?

Daniel Daza
8 апреля 2018 в 18:44
0

моя версия matplotlib 2.0.0, что вы подразумеваете под моим бэкэндом?

Daniel Daza
8 апреля 2018 в 18:48
0

Хорошо, когда я запускаю его из cli в файле .py, он отлично анимирует кривую, но в блокноте jupyter это не работает. Почему это могло произойти?

Mr. T
8 апреля 2018 в 19:51
0

Я не использую блокнот Jupyter, но, похоже, некоторые серверные части не поддерживают анимацию, см. здесь: coderhelper.com/a/46878531/8881141 или здесь: coderhelper.com/a/43447370/8881141