使用Qt4后端的matplotlib存在缓存渲染器

时间:2015-11-29 16:02:47

标签: python matplotlib qt4

我试图使用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中逐行运行它不会导致同样的错误?

1 个答案:

答案 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