`matplotlib`:艺术家的动画状态的目的是什么?

时间:2015-05-09 03:03:50

标签: python matplotlib

Artists in matplotlib have methods to set/get their animated state (a boolean).我似乎无法找到解释动画状态"的目的的文档。变量。你能解释一下,还是给我一个合适的资源?

1 个答案:

答案 0 :(得分:7)

我不确定它是否在任何地方都有详细记录,但艺术家的动画状态控制着在绘制情节时是否包含它。

如果animated为True,则在调用fig.draw()时不会绘制艺术家。相反,它只会在您手动调用draw_artist(artist_with_animated_set)时绘制。这允许简化blitting功能。

注意:这不适用于所有后端!我认为它适用于几乎所有的交互式后端,但它并不适用于非交互式后端。它旨在与blitting结合使用,因此不支持blit的后端不支持动画旗帜。

例如,如果我们做类似的事情:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(10), animated=True)
plt.show()

我们会得到一张空白图 - 不会绘制线条。 (注意:如果你保存这个数字,行出现。请参阅上面关于非交互式后端的警告.Matplotlib暂时切换到非交互式后端以保存数字。)

enter image description here

要了解这有用的原因,假设您正在制作动画或交互式gui(并且没有使用新的动画框架)。您将要使用blitting来使动画显示并且#34;平滑"。

但是,无论何时调整图形等,都需要更新动画的背景。处理此问题的最佳方法是将回调连接到draw事件。如果没有animated标记,您将不得不重绘绘图回调中的 图,这将导致无限循环。 (解决方法是断开并重新连接绘图事件回调,但这有点痛苦。)

无论如何,动画标志简化了这个过程。例如,您可以使用类似于以下内容的animated标志:

import numpy as np
import matplotlib.pyplot as plt

class AnimatedSinWave(object):
    def __init__(self, speed=0.1, interval=25):
        self.fig, self.ax = plt.subplots()
        self.x = np.linspace(0, 6 * np.pi, 200)
        self.i, self.speed = 0.0, speed

        self.line, = self.ax.plot(self.x, np.sin(self.x), animated=True)
        self.ax.set_title('Try resizing the figure window')

        self.fig.canvas.mpl_connect('draw_event', self.update_background)
        self.t = self.fig.canvas.new_timer(interval, [(self.update, [], {})])
        self.t.start()

    def update_background(self, event):
        self._background = self.fig.canvas.copy_from_bbox(self.ax.bbox)

    def update(self):
        self.fig.canvas.restore_region(self._background)

        self.line.set_ydata(np.sin(self.i * self.speed + self.x))
        self.ax.draw_artist(self.line)
        self.i += 1

        self.fig.canvas.blit(self.ax.bbox)

    def show(self):
        plt.show()

AnimatedSinWave().show()

注意:由于各种原因,您在OSX和qt * Agg后端会发生一些奇怪的事情。如果窗口首次弹出时背景为黑色,则移动或聚焦窗口,它应自行修复。

无论如何,如果没有animated标志(或更新的动画框架),该示例将变得更多更复杂。