Artists in matplotlib
have methods to set/get their animated state (a boolean).我似乎无法找到解释动画状态"的目的的文档。变量。你能解释一下,还是给我一个合适的资源?
答案 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暂时切换到非交互式后端以保存数字。)
要了解这有用的原因,假设您正在制作动画或交互式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
标志(或更新的动画框架),该示例将变得更多更复杂。