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

use*_*r89 10 python matplotlib

艺术家matplotlib们有方法来设置/获取他们的动画状态(布尔值).我似乎无法找到解释"动画状态"变量目的的文档.你能解释一下,还是给我一个合适的资源?

Joe*_*ton 8

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

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

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

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

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(10), animated=True)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我们将得到一个空白的图 - 不会绘制线.(注意:如果您保存此图,则会显示该行.请参阅上面关于非交互式后端的警告.Matplotlib暂时切换到非交互式后端以保存图形.)

在此输入图像描述

为了了解这有用的原因,假设您正在制作动画或交互式gui(并且没有使用新的动画框架).你会想要使用blitting来使动画看起来"平滑".

但是,无论何时调整图形等,都需要更新动画的背景.处理此问题的最佳方法是将回调连接到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()
Run Code Online (Sandbox Code Playgroud)

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

无论如何,没有animated标志(或较新的动画框架),该示例变更加复杂.