如何在交互式绘图时摆脱最大递归深度误差?

时间:2012-08-28 15:12:14

标签: python matplotlib

我正在尝试建立一个互动情节。如果在轴内单击并在随机位置绘制圆圈,则应该清除该图形。代码如下:

import matplotlib.pyplot as plt
import random


def draw_circle(event):
    if event.inaxes:
        print(event.xdata, event.ydata)
        plt.cla()
        a = random.randint(0,100)
        b = random.randint(0,100)
        s, = plt.plot(a,b,'o', ms=100, color="blue",visible=True )
        plt.show()


fig = plt.figure()
ax = plt.subplot(111)
s, = plt.plot(1,2,'o', ms=100, color="blue",visible=True )
plt.connect("button_press_event", draw_circle)
plt.show() 

点击42次后,程序中断,我得到以下追溯:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 286, in button_press_event
    FigureCanvasBase.button_press_event(self, x, y, num, guiEvent=event)
  File "/usr/lib/pymodules/python2.7/matplotlib/backend_bases.py", line 1632, in button_press_event
    self.callbacks.process(s, mouseevent)
  File "/usr/lib/pymodules/python2.7/matplotlib/cbook.py", line 262, in process
    proxy(*args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/cbook.py", line 192, in __call__
    return mtd(*args, **kwargs)
  File "/home/almarahat/Dropbox/python/GUI/Testing site/test_rt/baud_test.py", line 8, in draw_circle
    plt.cla()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2784, in cla
    ret =  gca().cla()
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 842, in cla
    spine.cla()
  File "/usr/lib/pymodules/python2.7/matplotlib/spines.py", line 157, in cla
    self.axis.cla()
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 731, in cla
    self.reset_ticks()
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 744, in reset_ticks
    self.majorTicks.extend([self._get_tick(major=True)])
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 1553, in _get_tick
    return XTick(self.axes, 0, '', major=major, **tick_kw)
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 141, in __init__
    self.tick2line = self._get_tick2line()
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 401, in _get_tick2line
    l.set_transform(self.axes.get_xaxis_transform(which='tick2'))
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 586, in get_xaxis_transform
    return self.spines['top'].get_spine_transform()
  File "/usr/lib/pymodules/python2.7/matplotlib/spines.py", line 374, in get_spine_transform
    self._ensure_position_is_set()
  File "/usr/lib/pymodules/python2.7/matplotlib/spines.py", line 140, in _ensure_position_is_set
    self.set_position(self._position)
  File "/usr/lib/pymodules/python2.7/matplotlib/spines.py", line 365, in set_position
    self.axis.cla()
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 731, in cla
    self.reset_ticks()
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 744, in reset_ticks
    self.majorTicks.extend([self._get_tick(major=True)])
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 1553, in _get_tick
    return XTick(self.axes, 0, '', major=major, **tick_kw)
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 140, in __init__
    self.tick1line = self._get_tick1line()
  File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 383, in _get_tick1line
    zorder=self._zorder,
  File "/usr/lib/pymodules/python2.7/matplotlib/lines.py", line 195, in __init__
    self._marker = MarkerStyle()
  File "/usr/lib/pymodules/python2.7/matplotlib/markers.py", line 112, in __init__
    self.set_marker(marker)
  File "/usr/lib/pymodules/python2.7/matplotlib/markers.py", line 171, in set_marker
    self._recache()
  File "/usr/lib/pymodules/python2.7/matplotlib/markers.py", line 116, in _recache
    self._path = Path(np.empty((0,2)))
  File "/usr/lib/pymodules/python2.7/matplotlib/path.py", line 112, in __init__
    if ma.isMaskedArray(vertices):
  File "/usr/local/lib/python2.7/dist-packages/numpy-1.6.2-py2.7-linux-x86_64.egg/numpy/ma/core.py", line 5683, in isMaskedArray
    return isinstance(x, MaskedArray)
RuntimeError: maximum recursion depth exceeded while calling a Python object

此时,我不确定递归发生的位置以及如何缓解此错误。

我理解(来自其他Q& As)我可以提高我的堆栈限制并解决问题。但是,我不认为这是在这种特殊情况下的解决方案,并且想要深究这一点。

任何帮助都会受到赞赏。

提前致谢。

其他信息:

  • 重要的主要功能包括清除图形并在点击画布时绘制新内容。
  • 如果我没有尝试绘制某些内容,则点击不会引发此错误。因此,我怀疑,我在处理matplotlib时遗漏了一些东西。

1 个答案:

答案 0 :(得分:8)

而不是plt.show(),来自您的回调电话plt.draw()。问题是plt.show运行GUI库的主循环;您只想更新现有主循环中显示的内容。使用Qt后端,您的代码将显示错误QCoreApplication::exec: The event loop is already running

有关如何以交互方式使用Matplotlib的更多指导,请参阅What is interactive mode?