matplotlib 动画 blit=True 导致 KeyError

matplotlib animation blit=True causes KeyError

我创建了一些动画,在设置关键字时效果很好——尽管速度很慢:

blit=False

但是,在我通过设置 blit=True 来加速动画的过程中,我在 运行 我的测试中遇到了一些奇怪的 KeyError 异常。

最后,我有预感它可能与编码错误无关,但可能与设置甚至错误有关。

于是我从here导入了simple_anim.py脚本,发现同样的错误发生了。

我测试了更多示例,它们都给出了相同的异常.... :(

任何人都可以帮助我并提供一些信息吗?

代码如下:

"""
A simple example of an animated plot
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))


def animate(i):
    line.set_ydata(np.sin(x + i/10.0))  # update the data
    return line,


# Init only required for blitting to give a clean slate.
def init():
    line.set_ydata(np.ma.array(x, mask=True))
    return line,

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init,
                              interval=25, blit=True)
plt.show()

引发的异常是:

Traceback (most recent call last):
  File "/home/dj754/anaconda3/lib/python3.5/site-packages/matplotlib/backend_bases.py", line 1305, in _on_timer
    ret = func(*args, **kwargs)
  File "/home/dj754/anaconda3/lib/python3.5/site-packages/matplotlib/animation.py", line 1021, in _step
    still_going = Animation._step(self, *args)
  File "/home/dj754/anaconda3/lib/python3.5/site-packages/matplotlib/animation.py", line 827, in _step
    self._draw_next_frame(framedata, self._blit)
  File "/home/dj754/anaconda3/lib/python3.5/site-packages/matplotlib/animation.py", line 845, in _draw_next_frame
    self._pre_draw(framedata, blit)
  File "/home/dj754/anaconda3/lib/python3.5/site-packages/matplotlib/animation.py", line 858, in _pre_draw
    self._blit_clear(self._drawn_artists, self._blit_cache)
  File "/home/dj754/anaconda3/lib/python3.5/site-packages/matplotlib/animation.py", line 898, in _blit_clear
    a.figure.canvas.restore_region(bg_cache[a])
KeyError: <matplotlib.axes._subplots.AxesSubplot object at 0x7fb3b9d3a198>

经过在家调试,我找到了自己问题的答案。我怀疑这是 ipython 中的一个错误,但我不想肯定地说,因为 99+% 的时间,错误是在屏幕和这个屏幕前面的椅子靠背之间。

事实证明它源于我所做的之前 运行我自己提供的脚本:通过[=打开交互10=]

这是一个新手错误,我已经更正了。但是,我在 simple_anim.py 之前 运行 通过 run simple_anim.py' (I prefer developing with IPython.. legacy of my MATLAB experiences). I've forgotten to mention this, but this turned out to be critical. If I had tried running the code *the normal way* viapython3 simple_anim.py 在 IPython3 中调用的脚本一切正常!

然而,事实证明 将交互模式设置为打开,同时处于 IPython 是异常的原因。

我很清楚通过 plt.ion() 在 IPython 中启用交互模式是非常愚蠢的,但是,它发生在我身上,我怀疑更多的人遭受过这种痛苦。因此,它认为这种行为(引发这样的 KeyError 异常)至少是不需要的行为,并且可能是 Ipython 或 matplotlib.pyplot.ion() 函数中的错误。

有没有人知道我应该如何以及是否应该提及这个 可能-bug?