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

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

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

谢谢,尼古拉斯。

回答:

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

dline = plot(xx,data)

对输入数据进行一些魔术分析,将您的数组分成一堆xy对,并绘制它们。请注意,dline是一个 列表Line2D对象。在这种情况下

mline, = plot([],[])

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

您正在创建一个Line2D对象,并且库最好将2D数据推入到1D绘图对象中,并通过展平输入来做到这一点。

要设置N线条动画,您只需要NLine2D对象:

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

以上是 Python,Matplotlib,绘制多条线(数组)和动画 的全部内容, 来源链接: utcz.com/qa/399981.html

回到顶部