我试图使用matplotlib以更快的方式重新绘制图像,因此我不使用重新绘制所有内容,而是使用AxesImage类的set_data方法,如下所示:
import numpy as np
import time
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
img = plt.imshow(np.random.rand(100, 100))
img.set_data(np.random.rand(100, 100))
ax.draw_artist(ax.patch)
ax.draw_artist(img)
fig.canvas.update()
fig.canvas.flush_events()
我遇到了这个错误:
追踪(最近的呼叫最后):... ax.draw_artist(ax.patch)File" /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/axes/_base.py", 第2319行,在draw_artist中 raise AttributeError(msg)AttributeError:draw_artist只能在缓存渲染的初始绘制后使用
但是,如果我在python shell(IPython)中逐行运行脚本,它可以工作,没有错。那么这个缓存渲染器背后的秘密是什么?
编辑:添加一行fig.canvas.draw()
解决问题,现在剩下的问题是为什么在IPython shell中逐行运行它不会导致同样的错误?
答案 0 :(得分:2)
正如您所知,有必要至少绘制一次画布以便在调用draw_artist
之前缓存渲染器:
<强>
draw_artist(a)
强>此方法只能在缓存渲染器的初始绘制后使用。它用于有效地更新Axes数据(轴刻度,标签等未更新)
我猜你在你的IPython会话中正在interactive mode中运行matplotlib,在这种情况下,你对plt.subplots
的初始调用将立即导致绘制新图形的画布,要缓存的渲染器。
要复制您在脚本中看到的AttributeError
,可以使用plt.ioff()
关闭互动模式:
In [1]: plt.ioff()
In [2]: fig, ax = plt.subplots(1, 1)
In [3]: img = plt.imshow(np.random.rand(100, 100))
In [4]: img.set_data(np.random.rand(100, 100))
In [5]: ax.draw_artist(ax.patch)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-b54815e41caa> in <module>()
----> 1 ax.draw_artist(ax.patch)
/home/alistair/.venvs/core/local/lib/python2.7/site-packages/matplotlib/axes/_base.pyc in draw_artist(self, a)
2317 msg = ('draw_artist can only be used after an initial draw which'
2318 ' caches the render')
-> 2319 raise AttributeError(msg)
2320 a.draw(self._cachedRenderer)
2321
AttributeError: draw_artist can only be used after an initial draw which caches the render