gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:08:48 28 4
gpt4 key购买 nike

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

对输入数据进行一些神奇的解析,将您的数组分成一堆 x-y 对并绘制它们。请注意,dlineLine2D 对象的列表。在这种情况下

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 为您执行它们要慢得多。

关于Python、Matplotlib、绘制多线(数组)和动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19519587/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com