【问题标题】:Matplotlib animation in for loop?for循环中的Matplotlib动画?
【发布时间】:2016-01-16 13:50:57
【问题描述】:

我正在尝试在 for 循环中通过动画绘制一些数据。我希望它等到动画完成,然后在 for 循环中继续。暂停似乎可以做到这一点,但有时电影很长,我想关闭并移至下一部。有谁知道我怎么能做到这一点?

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
import time

for j in range(0,2):
 fig = plt.figure(j)
 mngr = plt.get_current_fig_manager()
 mngr.window.setGeometry(j*256,0,256, 256)

 ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
 line, = ax.plot([], [], lw=2)

 # initialization function: plot the background of each frame
 def init():
    line.set_data([], [])
    return line,

 # animation function.  This is called sequentially
 def animate(i):
    x = np.linspace(0, 2, 1000)
    y = np.sin(2 * np.pi * (x - 0.01 * i+j/4.))
    line.set_data(x, y)
    return line,

 # call the animator.  blit=True means only re-draw the parts that have changed.
 anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=200, interval=20, blit=True,repeat=False)

 plt.pause(0.02*200)

 plt.show(block=True)

【问题讨论】:

  • plt.pause(0.02*200)之后添加plt.close()

标签: python animation matplotlib


【解决方案1】:

一种方法是使用KeyboardInterrupt 异常移动到下一个情节。 为了更好的可读性,请将您的绘图移动到一个函数中:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
import time



def animate_multi(j):
    fig = plt.figure(j)
    mngr = plt.get_current_fig_manager()
    mngr.window.setGeometry(j*256,0,256, 256)

    ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
    line, = ax.plot([], [], lw=2)

    # initialization function: plot the background of each frame
    def init():
        line.set_data([], [])
        return line,

    # animation function.  This is called sequentially
    def animate(i):
        x = np.linspace(0, 2, 1000)
        y = np.sin(2 * np.pi * (x - 0.01 * i+j/4.))
        line.set_data(x, y)
        return line,

    # call the animator.  blit=True means only re-draw the parts that have changed.
    anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=200, interval=20, blit=True,repeat=False)

    plt.pause(0.02*200)
    plt.close()
    plt.show(block=True)

现在,在你的循环中,除了KeyboardInterrup 并继续下一个动画:

for j in range(5):
    try:
        print('Working on plot', j)
        animate_multi(j)
    except KeyboardInterrupt:
        plt.close()

注意:您可能需要按两次<Ctrl>-<C> 才能跳到下一个动画。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2014-03-23
    • 2016-03-16
    • 2021-09-23
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多