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* via
python3 simple_anim.py 在 IPython3 中调用的脚本一切正常!
然而,事实证明 将交互模式设置为打开,同时处于 IPython 是异常的原因。
我很清楚通过 plt.ion()
在 IPython 中启用交互模式是非常愚蠢的,但是,它发生在我身上,我怀疑更多的人遭受过这种痛苦。因此,它认为这种行为(引发这样的 KeyError
异常)至少是不需要的行为,并且可能是 Ipython 或 matplotlib.pyplot.ion()
函数中的错误。
有没有人知道我应该如何以及是否应该提及这个 可能-bug?
我创建了一些动画,在设置关键字时效果很好——尽管速度很慢:
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* via
python3 simple_anim.py 在 IPython3 中调用的脚本一切正常!
然而,事实证明 将交互模式设置为打开,同时处于 IPython 是异常的原因。
我很清楚通过 plt.ion()
在 IPython 中启用交互模式是非常愚蠢的,但是,它发生在我身上,我怀疑更多的人遭受过这种痛苦。因此,它认为这种行为(引发这样的 KeyError
异常)至少是不需要的行为,并且可能是 Ipython 或 matplotlib.pyplot.ion()
函数中的错误。
有没有人知道我应该如何以及是否应该提及这个 可能-bug?