diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 7875b70aaddf..08f71a895b5b 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -345,9 +345,9 @@ def __init__(self, if frameon is None: frameon = rcParams['figure.frameon'] - if not np.isfinite(figsize).all(): - raise ValueError('figure size must be finite not ' - '{}'.format(figsize)) + if not np.isfinite(figsize).all() or (np.array(figsize) <= 0).any(): + raise ValueError('figure size must be positive finite not ' + f'{figsize}') self.bbox_inches = Bbox.from_bounds(0, 0, *figsize) self.dpi_scale_trans = Affine2D().scale(dpi, dpi) @@ -895,9 +895,9 @@ def set_size_inches(self, w, h=None, forward=True): # argument, so unpack them if h is None: w, h = w - if not all(np.isfinite(_) for _ in (w, h)): - raise ValueError('figure size must be finite not ' - '({}, {})'.format(w, h)) + size = w, h + if not np.isfinite(size).all() or (np.array(size) <= 0).any(): + raise ValueError(f'figure size must be positive finite not {size}') self.bbox_inches.p1 = w, h if forward: diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py index 5d2b9df85ae6..6ae4d430df01 100644 --- a/lib/matplotlib/tests/test_figure.py +++ b/lib/matplotlib/tests/test_figure.py @@ -325,14 +325,23 @@ def test_change_dpi(): assert fig.canvas.renderer.width == 200 -def test_invalid_figure_size(): +@pytest.mark.parametrize('width, height', [ + (1, np.nan), + (0, 1), + (-1, 1), + (np.inf, 1) +]) +def test_invalid_figure_size(width, height): with pytest.raises(ValueError): - plt.figure(figsize=(1, np.nan)) + plt.figure(figsize=(width, height)) fig = plt.figure() with pytest.raises(ValueError): - fig.set_size_inches(1, np.nan) + fig.set_size_inches(width, height) + +def test_invalid_figure_add_axes(): + fig = plt.figure() with pytest.raises(ValueError): fig.add_axes((.1, .1, .5, np.nan))