一尘不染

Python,Matplotlib,绘制多条线(数组)和动画

python

我开始使用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()

如果仅绘制“ dline”,则每条线将分别绘制并使用不同的颜色。如果仅绘制“ mline”,则所有线都是链接的,并且只有一种颜色。

我的目标是制作一个动画,其中“ 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()

我希望我已经明确地暴露了我的问题。

谢谢,尼古拉斯。


阅读 404

收藏
2021-01-20

共1个答案

一尘不染

正如@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它们做起来要慢得多。

2021-01-20