matplotlib animation blit = True导致KeyError

时间:2017-01-05 09:48:23

标签: python python-3.x animation matplotlib blit

我创建了一些效果很好的动画 - 尽管 - 在设置关键字时效果很慢:

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>

1 个答案:

答案 0 :(得分:0)

在家里进行一些调试之后,我找到了自己问题的答案。我怀疑它是ipython中的一个错误,但我不想肯定地说明这一点,因为99%以上的时间,错误发生在屏幕和屏幕前面的椅子背面。

事实证明,它源于我之前之前运行我自己提供的脚本:通过plt.ion()启用互动

这是一个新手的错误,我已经纠正了。但是,我在easy_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* via python3 simple_anim.py在IPython3中调用的'一切都会正常工作!

然而,事实证明将交互模式设置为on,而在IPython中是导致异常的原因。

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

有没有人对如何以及是否应该提及也许 -bug有任何想法?