From 5974a565f0f836519f46d1e36a00e19122af8ddc Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Fri, 2 Feb 2018 07:33:35 -0800 Subject: [PATCH 1/2] FIX: constrained layout uneven gridspec issues --- lib/matplotlib/_constrained_layout.py | 46 +++++++++++++++++---------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/lib/matplotlib/_constrained_layout.py b/lib/matplotlib/_constrained_layout.py index 3561fbfef2b0..79232024af28 100644 --- a/lib/matplotlib/_constrained_layout.py +++ b/lib/matplotlib/_constrained_layout.py @@ -361,15 +361,19 @@ def do_constrained_layout(fig, renderer, h_pad, w_pad, 'bottom') ########### - # Now we make the widths and heights similar. + # Now we make the widths and heights of position boxes + # similar. (i.e the spine locations) # This allows vertically stacked subplots to have - # different sizes if they occupy different ammounts + # different sizes if they occupy different amounts # of the gridspec: i.e. # gs = gridspec.GridSpec(3,1) # ax1 = gs[0,:] # ax2 = gs[1:,:] # then drows0 = 1, and drowsC = 2, and ax2 # should be at least twice as large as ax1. + # But it can be more than twice as large because + # it needs less room for the labeling. + # # For height, this only needs to be done if the # subplots share a column. For width if they # share a row. @@ -387,31 +391,41 @@ def do_constrained_layout(fig, renderer, h_pad, w_pad, dcolsC = (colnumCmax - colnumCmin + 1) dcols0 = (colnum0max - colnum0min + 1) - if drowsC > drows0: + if height0 > heightC: if in_same_column(ss0, ssc): ax._poslayoutbox.constrain_height_min( - axc._poslayoutbox.height * drows0 * height0 - / drowsC / heightC) - elif drowsC < drows0: - if in_same_column(ss0, ssc): + axc._poslayoutbox.height * height0 / + heightC) axc._poslayoutbox.constrain_height_min( - ax._poslayoutbox.height * drowsC * heightC - / drows0 / drowsC) + ax._poslayoutbox.height * heightC / + (height0*1.8)) else: + if in_same_column(ss0, ssc): + axc._poslayoutbox.constrain_height_min( + ax._poslayoutbox.height * heightC / + (height0)) + ax._poslayoutbox.constrain_height_min( + ax._poslayoutbox.height * height0 / + (heightC*1.8)) + if drows0 == drowsC: ax._poslayoutbox.constrain_height( axc._poslayoutbox.height * height0 / heightC) # widths... - if dcolsC > dcols0: + if width0 > widthC: if in_same_row(ss0, ssc): ax._poslayoutbox.constrain_width_min( - axc._poslayoutbox.width * dcols0 * width0 - / dcolsC / widthC) - elif dcolsC < dcols0: - if in_same_row(ss0, ssc): + axc._poslayoutbox.width * width0 / widthC) axc._poslayoutbox.constrain_width_min( - ax._poslayoutbox.width * dcolsC * widthC - / dcols0 / width0) + ax._poslayoutbox.width * widthC / + (width0*1.8)) else: + if in_same_row(ss0, ssc): + axc._poslayoutbox.constrain_width_min( + ax._poslayoutbox.width * widthC / width0) + ax._poslayoutbox.constrain_width_min( + axc._poslayoutbox.width * width0 / + (widthC*1.8)) + if dcols0 == dcolsC: ax._poslayoutbox.constrain_width( axc._poslayoutbox.width * width0 / widthC) From 698cf7f403c902b1b507b984f4509870c03de074 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Fri, 2 Feb 2018 09:38:50 -0800 Subject: [PATCH 2/2] TST: add better test for uneven layout --- lib/matplotlib/_constrained_layout.py | 12 ++++++------ .../constrained_layout17.png | Bin 0 -> 32858 bytes .../tests/test_constrainedlayout.py | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_constrainedlayout/constrained_layout17.png diff --git a/lib/matplotlib/_constrained_layout.py b/lib/matplotlib/_constrained_layout.py index 79232024af28..c90bacd590ba 100644 --- a/lib/matplotlib/_constrained_layout.py +++ b/lib/matplotlib/_constrained_layout.py @@ -394,18 +394,18 @@ def do_constrained_layout(fig, renderer, h_pad, w_pad, if height0 > heightC: if in_same_column(ss0, ssc): ax._poslayoutbox.constrain_height_min( - axc._poslayoutbox.height * height0 / - heightC) + axc._poslayoutbox.height * height0 / heightC) + # these constraints stop the smaller axes from + # being allowed to go to zero height... axc._poslayoutbox.constrain_height_min( - ax._poslayoutbox.height * heightC / + ax._poslayoutbox.height * heightC / (height0*1.8)) else: if in_same_column(ss0, ssc): axc._poslayoutbox.constrain_height_min( - ax._poslayoutbox.height * heightC / - (height0)) + ax._poslayoutbox.height * heightC / height0) ax._poslayoutbox.constrain_height_min( - ax._poslayoutbox.height * height0 / + ax._poslayoutbox.height * height0 / (heightC*1.8)) if drows0 == drowsC: ax._poslayoutbox.constrain_height( diff --git a/lib/matplotlib/tests/baseline_images/test_constrainedlayout/constrained_layout17.png b/lib/matplotlib/tests/baseline_images/test_constrainedlayout/constrained_layout17.png new file mode 100644 index 0000000000000000000000000000000000000000..41ceab8f38d28aa88cfca7d8356d0ec54e762e38 GIT binary patch literal 32858 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
>jNW@=88^p}|8-A7(#O>> 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py index 5333ba8c85b5..de3bee3bba8a 100644 --- a/lib/matplotlib/tests/test_constrainedlayout.py +++ b/lib/matplotlib/tests/test_constrainedlayout.py @@ -345,3 +345,21 @@ def test_constrained_layout16(): fig, ax = plt.subplots(constrained_layout=True) example_plot(ax, fontsize=12) ax2 = fig.add_axes([0.2, 0.2, 0.4, 0.4]) + + +@image_comparison(baseline_images=['constrained_layout17'], + extensions=['png']) +def test_constrained_layout17(): + 'Test uneven gridspecs' + fig = plt.figure(constrained_layout=True) + gs = gridspec.GridSpec(3, 3, figure=fig) + + ax1 = fig.add_subplot(gs[0, 0]) + ax2 = fig.add_subplot(gs[0, 1:]) + ax3 = fig.add_subplot(gs[1:, 0:2]) + ax4 = fig.add_subplot(gs[1:, -1]) + + example_plot(ax1) + example_plot(ax2) + example_plot(ax3) + example_plot(ax4)