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

現時点では、再帰が発生する場所と、このエラーを軽減する方法がわかりません。

スタック制限を強化して問題を回避できることを (他の Q&A から) 理解しています。しかし、私はそれをこの特定のケースの解決策とは考えていません。

どんな助けでも感謝します。

前もって感謝します。

追加情報:

  • 重要な主な機能には、キャンバスをクリックして図をクリアしたり、新しいものを描画したりすることが含まれます。
  • 何かをプロットしようとしていない場合、クリックしてもこのエラーは発生しません。したがって、matplotlib の処理に何かが欠けているのではないかと思います。
4

1 に答える 1

9

の代わりにplt.show()、コールバック呼び出し内からplt.draw(). 問題はplt.show、GUI ライブラリのメインループを実行することです。既存のメインループ内に表示されているものを更新したいだけです。Qt バックエンドを使用すると、コードでエラーが表示されますQCoreApplication::exec: The event loop is already running

対話モードとはを参照してください。Matplotlib をインタラクティブに使用する方法の詳細については、 を参照してください。

于 2012-08-28T15:17:07.083 に答える