python animation matplotlib julia-lang

python - Implementando un iterador en Julia para una animación con PyPlot



animation matplotlib (1)

En su código, invoca FuncAnimation de esta manera:

ani = anim.FuncAnimation(fig, simPoints, simData, blit = false, interval=10, repeat= true)

En el código original, simData era un generador, pero en su código no lo es, devuelve un generador, así que espero que su código lo invoque de esta manera:

ani = anim.FuncAnimation(fig, simPoints, simData(), blit = false, interval=10, repeat= true)

Terminemos el problema, ya que no podemos hacer que Python reconozca el valor de retorno de simData () como interator, ignoraremos esa función y haremos que simPoints () llame a simData () para iniciar la tarea y luego devolver una función. para animar Python:

using PyCall using PyPlot pygui(true) @pyimport matplotlib.animation as animation function simData() t_max = 10.0 dt = 0.05 x = 0.0 t = -dt function it() while t < t_max x = sin(pi * t) t = t + dt produce(x, t) end end Task(it) end function simPoints() task = simData() function points(frame_number) x, t = consume(task) line[:set_data](t, x) return(line, "") end points end figure = plt[:figure]() axis = figure[:add_subplot](111) line = axis[:plot]([], [], "bo", ms = 10)[1] axis[:set_ylim](-1, 1) axis[:set_xlim](0, 10) ani = animation.FuncAnimation(figure, simPoints(), blit=false, interval=10, frames=200, repeat=false) plt[:show]()

Esto funciona para una pasada de la bola que rebota en el gráfico y se detiene cuando toca el borde derecho (a diferencia del Python original que se repite).

Solo estoy tratando de reproducir este example simple de una animación en Matplotlib pero usando PyPlot en Julia. Estoy teniendo dificultades con la definición del iterador simData() que se pasa a la función funcAnimation , porque parece que PyPlot no reconoce el iterador que definí en Julia (a través de una Task ) como tal.

Aquí está mi enfoque para definir la misma función simData() :

function simData() t_max = 10.0 dt = 0.05 x = 0.0 t = 0.0 function it() while t < t_max x = sin(pi*t) t = t+dt produce(x,t) end end Task(it) end

Como puede comprobar, este tipo de iterador produce en teoría los mismos valores que el generador simData() python del ejemplo (intente, por ejemplo, collect(simData()) . Sin embargo, recibí este error cuando intento realizar la animación

LoadError: PyError (:PyObject_Call) <type ''exceptions.TypeError''> TypeError(''PyCall.jlwrap object is not an iterator'',) File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1067, in __init__ TimedAnimation.__init__(self, fig, **kwargs) File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 913, in __init__ *args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 591, in __init__ self._init_draw() File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1092, in _init_draw self._draw_frame(next(self.new_frame_seq())) while loading In[5], in expression starting on line 42 in pyerr_check at /home/diegotap/.julia/v0.4/PyCall/src/exception.jl:56 [inlined code] from /home/diegotap/.julia/v0.4/PyCall/src/exception.jl:81 in pycall at /home/diegotap/.julia/v0.4/PyCall/src/PyCall.jl:402 in call at /home/diegotap/.julia/v0.4/PyCall/src/PyCall.jl:429

Como mencioné, creo que el problema es que Python no reconoce el iterador Julia como tal. ¿Tienes alguna idea acerca de cómo solucionar eso?

PD: Here hay un cuaderno de Jupyter con el código completo que usé para hacer la animación.