Python、Matplotlib、绘制多行(数组)和动画
我开始用Python(和OOP)编程,但我在Fortran(90/95)和Matlab编程方面有丰富的经验 我正在tkinter环境中开发一个使用动画的小工具。 此工具的目标是为多行(数组而不是数据向量)设置动画。 下面是我的问题的一个简单例子。 我不明白为什么这两种绘制数据的方法的结果如此不同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(
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的帮助。我把问题的解决方案贴在下面。谢谢你的帮助。我的问题的解决方案发布在下面。