8000 [Bug]: CenteredNorm gets stuck in infinite recursion when given all zeros · Issue #24093 · matplotlib/matplotlib · GitHub
[go: up one dir, main page]

Skip to content
[Bug]: CenteredNorm gets stuck in infinite recursion when given all zeros #24093
Closed
@npbarnes

Description

@npbarnes

Bug summary

If you try to make a pcolormesh plot with an array of all zeros, a CenteredNorm, and a colorbar it goes into infinite recursion and raises a RecursionError and then the exception handler also goes into infinite recursion and raises another RecursionError over and over again, forever (or at least as long as my patience). It appears to be infinitely recursive infinite recursion.

Code for reproduction

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import CenteredNorm

a = np.reshape(np.zeros(9), (3,3))
plt.pcolormesh(a, norm=CenteredNorm())
plt.colorbar()

Actual outcome

Traceback (most recent call last):
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 307, in process
func(*args, **kwargs)
File "/import/home/npbarnes/py3/lib/ 85EE python3.10/site-packages/matplotlib/colorbar.py", line 495, in update_normal
self._draw_all()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colorbar.py", line 521, in _draw_all
self._long_axis().set(label_position=self.ticklocation,
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 117, in
cls.set = lambda self, **kwargs: Artist.set(self, **kwargs)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 1194, in set
return self._internal_update(cbook.normalize_kwargs(kwargs, self))
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 1186, in _internal_update
return self._update_props(
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 1162, in _update_props
ret.append(func(v))
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/axis.py", line 2494, in set_label_position
self.stale = True
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 300, in stale
self.stale_callback(self, val)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 84, in _stale_axes_callback
self.axes.stale = val
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 300, in stale
self.stale_callback(self, val)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/figure.py", line 53, in _stale_figure_callback
self.figure.stale = val
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 300, in stale
self.stale_callback(self, val)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/pyplot.py", line 806, in _auto_draw_if_interactive
if (val and matplotlib.is_interactive()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/init.py", line 1201, in is_interactive
return rcParams['interactive']
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/init.py", line 673, in getitem
elif key == "backend" and self is globals().get("rcParams"):
RecursionError: maximum recursion depth exceeded in comparison

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 307, in process
func(*args, **kwargs)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cm.py", line 652, in changed
self.callbacks.process('changed', self)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 312, in process
self.exception_handler(exc)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 98, in _exception_printer
traceback.print_exc()
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 179, in print_exc
print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 119, in print_exception
te = TracebackException(type(value), value, tb, limit=limit, compact=True)
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 502, in init
self.stack = StackSummary.extract(
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 383, in extract
f.line
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 306, in line
self._line = linecache.getline(self.filename, self.lineno)
File "/import/home/npbarnes/py3/lib/python3.10/linecache.py", line 30, in getline
lines = getlines(filename, module_globals)
File "/import/home/npbarnes/py3/lib/python3.10/linecache.py", line 46, in getlines
return updatecache(filename, module_globals)
File "/import/home/npbarnes/py3/lib/python3.10/linecache.py", line 136, in updatecache
with tokenize.open(fullname) as fp:
RecursionError: maximum recursion depth exceeded while calling a Python object

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 307, in process
func(*args, **kwargs)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colorbar.py", line 495, in update_normal
self._draw_all()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colorbar.py", line 535, in _draw_all
X, Y = self._mesh()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colorbar.py", line 1110, in _mesh
y, _ = self._proportional_y()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colorbar.py", line 1233, in _proportional_y
y = self.norm(self._boundaries.copy())
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colors.py", line 1571, in call
self._set_vmin_vmax()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colors.py", line 1522, in _set_vmin_vmax
self.vmin = self._vcenter - self._halfrange
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colors.py", line 1245, in vmin
self._changed()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colors.py", line 1273, in _changed
self.callbacks.process('changed')
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 312, in process
self.exception_handler(exc)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 98, in _exception_printer
traceback.print_exc()
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 179, in print_exc
print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 119, in print_exception
te = TracebackException(type(value), value, tb, limit=limit, compact=True)
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 552, in init
context = TracebackException(
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 502, in init
self.stack = StackSummary.extract(
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 383, in extract
f.line
File "/import/home/npbarnes/py3/lib/python3.10/traceback.py", line 306, in line
self._line = linecache.getline(self.filename, self.lineno)
File "/import/home/npbarnes/py3/lib/python3.10/linecache.py", line 30, in getline
lines = getlines(filename, module_globals)
File "/import/home/npbarnes/py3/lib/python3.10/linecache.py", line 46, in getlines
return updatecache(filename, module_globals)
File "/import/home/npbarnes/py3/lib/python3.10/linecache.py", line 136, in updatecache
with tokenize.open(fullname) as fp:
RecursionError: maximum recursion depth exceeded while calling a Python object
Traceback (most recent call last):
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 307, in process
func(*args, **kwargs)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colorbar.py", line 495, in update_normal
self._draw_all()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/colorbar.py", line 521, in _draw_all
self._long_axis().set(label_position=self.ticklocation,
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 117, in
cls.set = lambda self, **kwargs: Artist.set(self, **kwargs)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 1194, in set
return self._internal_update(cbook.normalize_kwargs(kwargs, self))
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 1186, in _internal_update
return self._update_props(
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 1162, in _update_props
ret.append(func(v))
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/axis.py", line 2494, in set_label_position
self.stale = True
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 300, in stale
self.stale_callback(self, val)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 84, in _stale_axes_callback
self.axes.stale = val
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 300, in stale
self.stale_callback(self, val)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/figure.py", line 53, in _stale_figure_callback
self.figure.stale = val
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/artist.py", line 300, in stale
self.stale_callback(self, val)
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/pyplot.py", line 806, in _auto_draw_if_interactive
if (val and matplotlib.is_interactive()
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/init.py", line 1201, in is_interactive
return rcParams['interactive']
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/init.py", line 673, in getitem
elif key == "backend" and self is globals().get("rcParams"):
RecursionError: maximum recursion depth exceeded in comparison
Traceback (most recent call last):
File "/import/home/npbarnes/py3/lib/python3.10/site-packages/matplotlib/cbook/init.py", line 307, in process
func(*args, **kwargs)
.
.
.
.
.

This is just a small snippet. I let it run for a little while and got several hundred thousand lines like this.

Expected outcome

I would expect it to give me a much shorter and more descriptive error message. Or I suppose it might be acceptable if it produced a centered colorbar with some default range e.g. (-1,1). Personally, I'd prefer a descriptive error message.

Additional information

No response

Operating system

CentOS release 6.10

Matplotlib Version

3.6.0

Matplotlib Backend

QtAgg

Python version

Python 3.10.6

Jupyter version

No response

Installation

conda

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0