7

我正在尝试构建一个交互式情节。如果在轴内单击并在随机位置画一个圆圈,这个应该会清除图形。代码如下:

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

在这一点上,我不确定递归发生在哪里以及如何缓解这个错误。

我知道(从其他问答中)我可以提高我的筹码限制并解决问题。但是,我不认为这是在这种特殊情况下的解决方案,并且想深入了解这一点。

任何帮助将不胜感激。

提前致谢。

附加信息:

  • 重要的主要功能包括清除图形并在单击画布时绘制新内容。
  • The clicking does not raise this error, if I am not trying to plot something. Thus, I suspect, I'm missing something in handling matplotlib.
4

1 回答 1

9

Instead of plt.show(), from within your callback call plt.draw(). The problem is that plt.show runs a mainloop of the GUI library; you just want to update what is shown within the existing mainloop. Using the Qt backend, your code would show the error QCoreApplication::exec: The event loop is already running.

See What is interactive mode? for more guidance on how to use Matplotlib interactively.

于 2012-08-28T15:17:07.083 回答