3

我正在绘制圆圈的动画。只要speed设置为正数,它看起来和工作都很好。但是,我想设置speed0.0. 当我这样做时,某些东西会发生变化,并且不再具有动画效果。相反,我必须在每一帧之后单击窗口上的“x”。我尝试使用plt.draw()和的组合plt.show()来获得与 相同的效果plt.pause(),但框架没有出现。如何在plt.pause()不涉及计时器或将其设置为的情况下精确复制 的功能0.0

speed = 0.0001
plt.ion()
for i in range(timesteps):
    fig, ax = plt.subplots()
    for j in range(num):
        circle = plt.Circle(a[j], b[j]), r[j], color='b')
        fig.gca().add_artist(circle)
    plt.pause(speed)
    #plt.draw()
    #plt.show()
    plt.clf()
    plt.close()
4

1 回答 1

3

我复制了pyplot.pause()这里的代码:

def pause(interval):
    """
    Pause for *interval* seconds.

    If there is an active figure it will be updated and displayed,
    and the GUI event loop will run during the pause.

    If there is no active figure, or if a non-interactive backend
    is in use, this executes time.sleep(interval).

    This can be used for crude animation. For more complex
    animation, see :mod:`matplotlib.animation`.

    This function is experimental; its behavior may be changed
    or extended in a future release.

    """
    backend = rcParams['backend']
    if backend in _interactive_bk:
        figManager = _pylab_helpers.Gcf.get_active()
        if figManager is not None:
            canvas = figManager.canvas
            canvas.draw()
            show(block=False)
            canvas.start_event_loop(interval)
            return

    # No on-screen figure is active, so sleep() is all we need.
    import time
    time.sleep(interval)

如您所见,它调用start_event_loopinterval ,它会在几秒钟内启动一个单独的粗略事件循环。如果interval== 0 似乎是后端依赖会发生什么。例如,对于 WX 后端,值为 0 意味着这个循环是阻塞的并且永远不会结束(我必须查看这里的代码,它没有出现在文档中。参见第 773 行)。

简而言之,0是一个特例。你不能把它设置成一个小值,例如0.1秒吗?

上面的pause文档字符串说它只能用于粗略的动画,如果你想要更复杂的东西,你可能不得不求助于动画模块。

于 2015-11-20T11:12:59.760 回答