Skip to content

Commit 0753a56

Browse files
author
Vedant Nanda
committed
raised error if axes limits are non-finite
1 parent d16c4a1 commit 0753a56

File tree

2 files changed

+36
-12
lines changed

2 files changed

+36
-12
lines changed

lib/mpl_toolkits/mplot3d/axes3d.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,19 @@ def _determine_lims(self, xmin=None, xmax=None, *args, **kwargs):
587587
xmax += 0.05
588588
return (xmin, xmax)
589589

590+
def _validate_axis_limits(self, limit, convert):
591+
"""
592+
If the axis limits being set are infinite, this function
593+
594+
raises an error.
595+
596+
"""
597+
if limit is not None:
598+
if (isinstance(limit, float) and
599+
(not np.isreal(limit) or not np.isfinite(limit))):
600+
raise ValueError("NaN or Inf cannot be the argument values")
601+
return convert(limit)
602+
590603
def set_xlim3d(self, left=None, right=None, emit=True, auto=False, **kw):
591604
"""
592605
Set 3D x limits.
@@ -605,10 +618,8 @@ def set_xlim3d(self, left=None, right=None, emit=True, auto=False, **kw):
605618
left, right = left
606619

607620
self._process_unit_info(xdata=(left, right))
608-
if left is not None:
609-
left = self.convert_xunits(left)
610-
if right is not None:
611-
right = self.convert_xunits(right)
621+
left = self._validate_axis_limits(left, self.convert_xunits)
622+
right = self._validate_axis_limits(right, self.convert_xunits)
612623

613624
old_left, old_right = self.get_xlim()
614625
if left is None:
@@ -665,10 +676,8 @@ def set_ylim3d(self, bottom=None, top=None, emit=True, auto=False, **kw):
665676
top = self.convert_yunits(top)
666677

667678
old_bottom, old_top = self.get_ylim()
668-
if bottom is None:
669-
bottom = old_bottom
670-
if top is None:
671-
top = old_top
679+
bottom = self._validate_axis_limits(bottom, self.convert_yunits)
680+
top = self._validate_axis_limits(top, self.convert_yunits)
672681

673682
if top == bottom:
674683
warnings.warn(('Attempting to set identical bottom==top results\n'
@@ -713,10 +722,8 @@ def set_zlim3d(self, bottom=None, top=None, emit=True, auto=False, **kw):
713722
bottom, top = bottom
714723

715724
self._process_unit_info(zdata=(bottom, top))
716-
if bottom is not None:
717-
bottom = self.convert_zunits(bottom)
718-
if top is not None:
719-
top = self.convert_zunits(top)
725+
bottom = self._validate_axis_limits(bottom, self.convert_yunits)
726+
top = self._validate_axis_limits(top, self.convert_yunits)
720727

721728
old_bottom, old_top = self.get_zlim()
722729
if bottom is None:

lib/mpl_toolkits/tests/test_mplot3d.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,3 +547,20 @@ def test_axes3d_ortho():
547547
fig = plt.figure()
548548
ax = fig.gca(projection='3d')
549549
ax.set_proj_type('ortho')
550+
551+
552+
@pytest.mark.parametrize('value', [np.inf, np.nan])
553+
@pytest.mark.parametrize(('setter', 'side'), [
554+
('set_xlim3d', 'left'),
555+
('set_xlim3d', 'right'),
556+
('set_ylim3d', 'bottom'),
557+
('set_ylim3d', 'top'),
558+
('set_zlim3d', 'bottom'),
559+
('set_zlim3d', 'top'),
560+
])
561+
def test_invalid_axes_limits(setter, side, value):
562+
limit = {side: value}
563+
with pytest.raises(ValueError):
564+
fig = plt.figure()
565+
obj = fig.add_subplot(111, projection='3d')
566+
getattr(obj, setter)(**limit)

0 commit comments

Comments
 (0)