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
线条动画,您只需要N
Line2D
对象:
lines = [plot([],[])[0] for j in range(Ny)] # make a whole bunch of linesdef 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