Анимация функции, параметры функции которой изменяются со временем, с помощью FuncAnimation - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь анимировать одномерную функцию, в которой входы функций одинаковы, но параметры функций меняются со временем.Функция, которую я пытаюсь оживить:

f (x) = sin (a * pi * x) / (b * x) + (x-1) ^ 4

Вот данныебыть построенным так же, но a, b меняются с каждым обновлением. Я использую библиотеки python и matplotlib.Моя первоначальная попытка выглядит следующим образом:

fig,ax = plt.subplots()
line, = ax.plot([],[])

def animate(i,func_params):
    x = np.linspace(-0.5,2.5,num = 200)
    a=func_params[i][0]
    b=func_params[i][1]
    y=np.sin(a*math.pi*x)/b*x + (x-1)**4
    line.set_xdata(x)
    line.set_ydata(y)
    return line,

ani = animation.FuncAnimation(fig,animate,frames=len(visualize_pop),fargs=(visualize_func,),interval = 100,blit=True)
plt.show()

Приведенный выше код ничего не отображает.

РЕДАКТИРОВАТЬ: обновленный код на основе комментария.

1 Ответ

0 голосов
/ 30 ноября 2018

Ваша проблема в том, что с plot([],[]) вы не даете matplotlib никаких данных и, следовательно, никак не можете определить пределы осей.Поэтому он использует некоторые значения по умолчанию, выходящие за пределы диапазона данных, которые вы на самом деле хотите построить.Таким образом, у вас есть два варианта:

1) Установите ограничения для некоторых значений, которые будут содержать все ваши построенные данные для всех случаев, например,

ax.set_xlim([-0.5,2.5])
ax.set_ylim([-2,6])

2) Пусть ax вычислит пределыавтоматически каждый кадр и масштабирование графика см. здесь с использованием этих двух команд в вашей функции анимации (обратите внимание, что эта опция работает правильно, только если вы выключите блиц):

ax.relim()
ax.autoscale_view()

Здесьвсе еще полностью рабочая версия вашего кода (команды для решения (1) закомментированы, и я изменил некоторые обозначения):

from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

fig,ax = plt.subplots()
x = np.linspace(-0.5,2.5,num = 200)
line, = ax.plot([],[])

#ax.set_xlim([-0.5,2.5])
#ax.set_ylim([-2,6])

##assuming some parameters, because none were given by the OP:
N = 20
func_args = np.array([np.linspace(1,2,N), np.linspace(2,1,N)])

def animate(i,func_params):
    a=func_params[0,i]
    b=func_params[1,i]
    y=np.sin(a*np.pi*x)/b*x + (x-1)**4
    line.set_xdata(x)
    line.set_ydata(y)
    ax.relim()
    ax.autoscale_view()
    return line, ax

##blit=True will not update the axes labels correctly
ani = FuncAnimation(
    fig,animate,frames=N, fargs=(func_args,),interval = 100 #, blit=True
)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...