我想要一个线(Line2D)对象随着图形的几个轴上的当前光标位置移动。我现在这样做的方法是每次光标移动时重新绘制整个数字,通过调用
fig.canvas.draw()
我的图包含14个面板,其中10个面板必须随光标移动,这样做很长。
我想知道如何更新仅这些行,而不是重新绘制整个行。
所以我尝试使用
ax.draw_artist(line)
但这会崩溃。这是一个小例子:
fig,ax = subplots()
line = Line2D([0.3,0.3],[0.1,0.8])
ax.add_artist(line)
fig.canvas.draw()
#here I see the line on the figure ok
# I update the position of the line
line.set_xdata([0.6,0.8])
# now draw the line (this should add another one (*))
ax.draw_artist(line)
这最后一行会导致以下错误:
----------------------------------------------- ---------------------------- RuntimeError Traceback(最近一次调用 最后)in() ----> 1 ax.draw_artist(line)
/Users/Heimdall/anaconda/lib/python2.7/site-packages/matplotlib/axes.pyc 在draw_artist(self,a)2096“”“2097断言 self._cachedRenderer不是None - > 2098 a.draw(self._cachedRenderer)2099 2100 def redraw_in_frame(self):
/Users/Heimdall/anaconda/lib/python2.7/site-packages/matplotlib/artist.pyc 在draw_wrapper中(艺术家,渲染器,* args,** kwargs) 53 def draw_wrapper(艺术家,渲染器,* args,** kwargs): 54之前(艺术家,渲染器) ---> 55画(艺术家,渲染器,* args,** kwargs) 56后(艺术家,渲染器) 57
/Users/Heimdall/anaconda/lib/python2.7/site-packages/matplotlib/lines.pyc 在平局(自我,渲染器) 524 525 renderer.open_group('line2d',self.get_gid()) - > 526 gc = renderer.new_gc() 527 self._set_gc_clip(gc) 528
/Users/Heimdall/anaconda/lib/python2.7/site-packages/matplotlib/backends/backend_macosx.pyc 在new_gc(个体经营) 95 96 def new_gc(self): ---> 97 self.gc.save() 98 self.gc.set_hatch(无) 99 self.gc._alpha = 1.0
RuntimeError:CGContextRef为NULL
我不确定这个错误来自哪里?
另外,我已经看到我应该以某种方式在绘制第一行之前保存画布并在每次绘制时恢复它,因此只显示一行。我见过这可以用:
background = canvas.copy_from_bbox(ax.bbox)
并使用
恢复它canvas.restore_region(background)
但是我在对象'canvas'中没有这两种方法。这是MacOSX后端的问题吗?
我在macOS 10.9上安装了分发anaconda的matplotlib 1.3.1。
我也被告知可以使用:
fig.canvas.blit(line.clipbox)
在新位置画线,但这绝对没有。
答案 0 :(得分:0)
所以我找到的唯一解决方案就是放弃anaconda并使用macports和后端qt4重新安装所有内容。
sudo port install py27-matplotlib +qt4