Python、Matplotlib、绘制多行(数组)和动画

Python、Matplotlib、绘制多行(数组)和动画,python,animation,matplotlib,plot,Python,Animation,Matplotlib,Plot,我开始用Python(和OOP)编程,但我在Fortran(90/95)和Matlab编程方面有丰富的经验 我正在tkinter环境中开发一个使用动画的小工具。 此工具的目标是为多行(数组而不是数据向量)设置动画。 下面是我的问题的一个简单例子。 我不明白为什么这两种绘制数据的方法的结果如此不同 from pylab import * Nx=10 Ny=20 xx = zeros( ( Nx,Ny) ) data = zeros( ( Nx,Ny) ) for ii in range(

我开始用Python(和OOP)编程,但我在Fortran(90/95)和Matlab编程方面有丰富的经验

我正在tkinter环境中开发一个使用动画的小工具。 此工具的目标是为多行(数组而不是数据向量)设置动画。 下面是我的问题的一个简单例子。 我不明白为什么这两种绘制数据的方法的结果如此不同

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()
如果仅打印“数据线”,则每条线将单独打印并使用不同的颜色。 如果仅打印“多线”,则所有线都将链接并仅使用一种颜色

我的目标是制作一个动画,用“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()
我希望我已经清楚地暴露了我的问题

谢谢,
尼古拉斯。

正如@Rutger Kassies在评论中指出的那样

dline = plot(xx,data)
对输入数据进行一些神奇的解析,将数组分成一组x-y对,并绘制这些对。请注意,
dline
Line2D
对象的列表。在这种情况下

mline, = plot([],[])
mline.set_data(xx.T,data.T)
您正在创建单个
Line2D
对象,库最好将二维数据推入一维打印对象,并通过展平输入来实现

要设置
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

您也不需要预先分配
数据
,用python执行循环比让
numpy
为您执行循环要慢得多。

多亏了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()

如果将二维数据传递给
plt.plot()
它将转换为单独的项目,因此
dline
是一个包含20个单独线条对象的列表。您的
mline
只是一个单行对象。如果您将二维数据传递给它,数据将被展平,就像您使用
dline=ax.plot(xx.flat,data.flat)
一样。感谢Rutger Kassies的帮助。我把问题的解决方案贴在下面。谢谢你的帮助。我的问题的解决方案发布在下面。