5

Python (および OOP) でプログラミングを始めていますが、Fortran (90/95) と Matlab プログラミングの経験は豊富です。

tkinter 環境でアニメーションを使った小さなツールを開発しています。このツールの目的は、複数行 (データのベクトルではなく配列) をアニメーション化することです。以下、私の問題の簡単な例です。データをプロットするこれら 2 つの方法の結果が非常に異なる理由がわかりません。

from pylab import *

Nx=10
Ny=20

xx   = zeros( ( Nx,Ny) )
data = zeros( ( Nx,Ny) )

for ii in range(0,Nx):
    for jj in range(0,Ny):
        xx[ii,jj]   = ii
        data[ii,jj] = jj


dline = plot(xx,data)

mline, = plot([],[])
mline.set_data(xx.T,data.T)

show()

「dline」のみをプロットすると、各線が別々に異なる色でプロットされます。「mline」のみをプロットすると、すべての線がリンクされ、1 色だけになります。

私の目標は、各ループでデータを変更する「mline」でアニメーションを作成することです。ここに私の目的を示す簡単なソースコードがあります:

from pylab import *
from matplotlib import animation

Nx=10
Ny=20

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, Nx), ylim=(0, Ny))

xx   = zeros( ( Nx,Ny) )
data = zeros( ( Nx,Ny) )
odata = zeros( ( Nx,Ny) )

for ii in range(0,Nx):
    for jj in range(0,Ny):
        xx[ii,jj]    = ii
        odata[ii,jj] = jj
        data[ii,jj]  = 0.

#dline = plot(xx,odata)

mline, = plot([],[])

def init():
    mline.set_data([],[])
    return mline,

def animate(coef):
   for ii in range(0,Nx):
        for jj in range(0,Ny):
            data[ii,jj] = odata[ii,jj] * (1.-float(coef)/360.)

   mline.set_data(xx.T,data.T)
   return mline,

anim = animation.FuncAnimation(fig, animate, 
                               init_func=init, 
                               frames=360, 
                               interval=5,
                               blit=True)

plt.show()

私の問題を明らかにしたことを願っています。

ありがとう、ニコラス。

4

2 に答える 2

5

@Rutger Kassies がコメントで指摘しているように、

dline = plot(xx,data)

入力データに対していくつかの魔法の解析を行い、配列を一連の xy ペアに分割してプロットします。はオブジェクトdlineリストであることに注意してください。Line2Dこの場合

mline, = plot([],[])
mline.set_data(xx.T,data.T)

単一のLine2Dオブジェクトを作成していて、ライブラリは 2D データを 1D プロット オブジェクトに押し込むのが最善であり、入力を平坦化することによってそうします。

ラインをアニメーション化するには、オブジェクトNが必要です:N Line2D

lines = [plot([],[])[0] for j in range(Ny)] # make a whole bunch of lines

def init():
    for mline in lines:
        mline.set_data([],[])
    return lines

def animate(coef):
   data = odata * (1.-float(coef)/360.)
   for mline, x, d in zip(lines, data.T, xx.T):
       mline.set_data(x, d)
   return lines

また、事前に割り当てる必要はありませんdata。Python でループを実行するのは、ループを実行させるよりもはるかに遅くなりnumpyます。

于 2013-10-22T15:11:27.493 に答える
0

Rutger Kassies と tcaswell に感謝します。上記と同じ例ですが、今は思い通りに動作します。他の python プログラマーに役立つことを願っています。

from pylab import *
from matplotlib import animation

Nx=10
Ny=20

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)
axis([0, Nx-1, 0, Ny])

xx    = zeros( ( Nx,Ny) )
data  = zeros( ( Nx,Ny) )
odata = zeros( ( Nx,Ny) )

for ii in range(0,Nx):
    xx[ii,:]    = float(ii)

for jj in range(0,Ny):
    odata[:,jj] = float(jj)

#dline = plot(xx,odata)

lines = [plot([],[])[0] for j in range(Ny)] # make a whole bunch of lines


def init():
    for mline in lines:
        mline.set_data([],[])
    return lines

def animate(coef):

   data = odata * (1.-float(coef)/360.)

   for mline, x, d in zip(lines, xx.T, data.T,):
       mline.set_data(x, d)

   return lines

anim = animation.FuncAnimation(fig, animate, 
                               init_func=init, 
                               frames=360, 
                               interval=5,
                               blit=True)

plt.show()
于 2013-10-23T08:31:51.583 に答える