From ab203bdd0d2d5be6f46b9d16051bd45733cf4a94 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 12 Aug 2019 22:11:11 +0200 Subject: [PATCH] Backport PR #14919: FIX constrained_layout w/ hidden axes --- lib/matplotlib/_constrained_layout.py | 6 +++++- lib/matplotlib/tests/test_constrainedlayout.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/_constrained_layout.py b/lib/matplotlib/_constrained_layout.py index a2a70fdc0212..a79b61be6754 100644 --- a/lib/matplotlib/_constrained_layout.py +++ b/lib/matplotlib/_constrained_layout.py @@ -280,7 +280,11 @@ def _make_layout_margins(ax, renderer, h_pad, w_pad): invTransFig = fig.transFigure.inverted().transform_bbox pos = ax.get_position(original=True) tightbbox = ax.get_tightbbox(renderer=renderer) - bbox = invTransFig(tightbbox) + if tightbbox is None: + bbox = pos + else: + bbox = invTransFig(tightbbox) + # this can go wrong: if not (np.isfinite(bbox.width) and np.isfinite(bbox.height)): # just abort, this is likely a bad set of co-ordinates that diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py index df3e5cf18def..8769fcec3537 100644 --- a/lib/matplotlib/tests/test_constrainedlayout.py +++ b/lib/matplotlib/tests/test_constrainedlayout.py @@ -404,3 +404,16 @@ def test_colorbar_location(): fig.colorbar(pcm, ax=axs[-2, 3:], shrink=0.5, location='top') fig.colorbar(pcm, ax=axs[0, 0], shrink=0.5, location='left') fig.colorbar(pcm, ax=axs[1:3, 2], shrink=0.5, location='right') + + +def test_hidden_axes(): + # test that if we make an axes not visible that constrained_layout + # still works. Note the axes still takes space in the layout + # (as does a gridspec slot that is empty) + fig, axs = plt.subplots(2, 2, constrained_layout=True) + axs[0, 1].set_visible(False) + fig.canvas.draw() + extents1 = np.copy(axs[0, 0].get_position().extents) + + np.testing.assert_allclose(extents1, + [0.045552, 0.548288, 0.47319, 0.982638], rtol=1e-5)