Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get rid of maximum recursion depth error while plotting interactively?

I'm trying to build an interactive plot. This one is supposed to clear the figure if clicked within axes and draw a circle at a random place. The code is as follows:

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() 

After clicking for 42 times, the program breaks and I get the following traceback:

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

At this point, I am not certain where the recursion occurs and how to alleviate this error.

I understand (from other Q&As) that I could enhance my stack limit and get around the problem. However, I don't consider that as a solution in this particular case and would like to get to the bottom of this.

Any help would be appreciate.

Thanks in advance.

Additional Information:

  • The main functionality that matters include clearing the figure and drawing something new on clicking the canvas.
  • 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.
like image 250
Alma Rahat Avatar asked Aug 28 '12 15:08

Alma Rahat


People also ask

How do you bypass maximum recursion depth?

The maximum recursion depth in Python is 1000. You can change the limit by calling sys. setrecursionlimit() method.

How can you avoid maximum recursion depth exceeded in comparison?

The “maximum recursion depth exceeded in comparison” error is raised when you try to execute a function that exceeds Python's built in recursion limit. You can fix this error by rewriting your program to use an iterative approach or by increasing the recursion limit in Python.

How do you overcome maximum recursion depth in Python?

The Python interpreter limits the recursion limit so that infinite recursions are avoided. The “sys” module in Python provides a function called setrecursionlimit() to modify the recursion limit in Python. It takes one parameter, the value of the new recursion limit.

How do I remove a recursion error in Python?

Try increasing the recursion limit ( sys. setrecursionlimit ) or re-writing your code without recursion. Return the current value of the recursion limit, the maximum depth of the Python interpreter stack. This limit prevents infinite recursion from causing an overflow of the C stack and crashing Python.


1 Answers

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.

like image 98
ecatmur Avatar answered Oct 17 '22 22:10

ecatmur