PyPlot

2016-02-01 12 views
19

ile bir animasyon için Julia'da bir yineleyici uygulama Matblotlib'deki bir animasyonun bu basit example yeniden üretilmesine, ancak Julia'da PyPlot'u kullanmaya çalışıyorum. funcAnimation işlevine iletilen yineleyici simData() tanımında zorluklar yaşıyorum, çünkü PyPlot Julia'da tanımladığım yineleyiciyi (Task aracılığıyla) böyle algılamıyor gibi görünüyor. Örnek piton simData() jeneratör ile aynı değerleri (örneğin collect(simData()) için denemekPyPlot

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 

kontrol edebilirsiniz gibi, teoride yineleyici verim bu tür: Burada

aynı işlevi simData() tanımlamak benim yaklaşımdır Ben de belirtildiği gibi

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 

, ben sorun Julia yineleyici Python tarafından da böyle tanınmaz olduğunu düşünüyorum animasyonu yapmaya çalıştıklarında. Ancak, bu hata var. Eğer bir fikrin ab var mı Bunu düzeltmek için nasıl?

PS: Here, Jupyter dizüstü bilgisayarında, bu animasyonu yapmak için kullandığım kodun tamamı yer alıyor. Kodunuzda

cevap

7

, sen FuncAnimation bu şekilde çağırmak: Orijinal kodunda

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

, simData bir jeneratör, ama kodunuzda bunun bir jeneratör döner, değil, bu yüzden beklediğiniz - Elimizde bir interator olarak simData() dönüş değerini tanımaya Python alınamıyor yana, bu özelliği göz ardı edip simPoints gerekecek

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

sorununu bitirelim: kodunuzu bu şekilde çağırmak için() görevi başlatmak için simData() çağrısı yapın ve ardından Python işlevini canlandırın:

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]() 

Bu grafik üzerindeki zıplayan topun bir geçiş için çalışır ve (tekrarlar orijinal Python aksine) sağ kenarına geldiğinde durur.

İlgili konular