gpt4 book ai didi

python - 在 matplotlib 中使用 for 循环定义要动画的多个图

转载 作者:太空狗 更新时间:2023-10-29 21:19:55 28 4
gpt4 key购买 nike

Thanks to Jake Vanderplas , 我知道如何开始用 matplotlib 编写动画情节.这是一个示例代码:

from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()

ax = plt.axes(xlim=(0, 2), ylim=(0, 100))

line, = plt.plot([], [])

def init():
line.set_data([], [])
return line,

def animate(i):
line.set_data([0, 2], [0,i])
return line,

anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=100, interval=20, blit=True)

plt.show()

假设现在我想绘制大量的函数(在这里说四个),在循环的帮助下定义。我做了一些巫毒编程,试图了解如何模仿逗号后面的行,这就是我得到的(不用说它不起作用:AttributeError: 'tuple' object has no attribute 'axes').

from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()

ax = plt.axes(xlim=(0, 2), ylim=(0, 100))

line = []
N = 4

for j in range(N):
temp, = plt.plot([], [])
line.append(temp)

line = tuple(line)

def init():
for j in range(N):
line[j].set_data([], [])
return line,

def animate(i):
for j in range(N):
line[j].set_data([0, 2], [10 * j,i])
return line,

anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=100, interval=20, blit=True)

plt.show()

我的一些问题是:我怎样才能让它发挥作用?奖励(可能有关联):line, = plt.plot([], [])line = plt.plot([], []) 之间有什么区别>?

谢谢

最佳答案

在下面的解决方案中,我展示了一个更大的示例(还有条形图),它可以帮助人们更好地理解在其他情况下应该做什么。在代码之后我会解释一些细节并回答奖励问题。

import matplotlib
matplotlib.use('Qt5Agg') #use Qt5 as backend, comment this line for default backend

from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()

ax = plt.axes(xlim=(0, 2), ylim=(0, 100))

N = 4
lines = [plt.plot([], [])[0] for _ in range(N)] #lines to animate

rectangles = plt.bar([0.5,1,1.5],[50,40,90],width=0.1) #rectangles to animate

patches = lines + list(rectangles) #things to animate

def init():
#init lines
for line in lines:
line.set_data([], [])

#init rectangles
for rectangle in rectangles:
rectangle.set_height(0)

return patches #return everything that must be updated

def animate(i):
#animate lines
for j,line in enumerate(lines):
line.set_data([0, 2], [10 * j,i])

#animate rectangles
for j,rectangle in enumerate(rectangles):
rectangle.set_height(i/(j+1))

return patches #return everything that must be updated

anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=100, interval=20, blit=True)

plt.show()

解释

想法是绘制您需要的内容,然后重用 matplotlib 返回的艺术家(参见更多 here )。这是通过首先绘制一个你想要的虚拟草图并保留 matplotlib 给你的对象来完成的。然后在您的 initanimate 函数上,您可以更新需要设置动画的对象。

请注意,在 plt.plot([], [])[0] 中,我们得到了一个线条艺术家,因此我用 [plt .plot([], [])[0] for _ in range(N)]。另一方面,plt.bar([0.5,1,1.5],[50,40,90],width=0.1) 返回一个可以为 rectangle artists< 迭代的容器/强>。 list(rectangles) 只需将此容器转换为一个列表,以便与 lines 连接。

我将线条与矩形分开,因为它们的更新方式不同(并且是不同的艺术家),但是 initanimate 返回所有这些。

奖励问题的答案:

  1. line, = plt.plot([], [])plt.plot 返回的列表的第一个元素分配给可验证的 line
  2. line = plt.plot([], []) 只需分配整个列表(只有一个元素)。

关于python - 在 matplotlib 中使用 for 循环定义要动画的多个图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937976/

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