From 9e7a6bfd8d78461c0e78fea0cb60cc1adb012f9f Mon Sep 17 00:00:00 2001 From: jakelevi1996 Date: Thu, 26 Sep 2024 18:49:02 +0100 Subject: [PATCH 1/7] Ensure that `GridSpecFromSubplotSpec` instances are contained within their parent --- lib/matplotlib/_constrained_layout.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/_constrained_layout.py b/lib/matplotlib/_constrained_layout.py index 5623e12a3c41..40bc2f08723d 100644 --- a/lib/matplotlib/_constrained_layout.py +++ b/lib/matplotlib/_constrained_layout.py @@ -232,6 +232,7 @@ def make_layoutgrids_gs(layoutgrids, gs): if rep not in layoutgrids: layoutgrids[rep] = mlayoutgrid.LayoutGrid( parent=subspeclb, + parent_inner=True, name='top', nrows=1, ncols=1, parent_pos=(subplot_spec.rowspan, subplot_spec.colspan)) From ccd482f83407a192ca656d5ad774059a00d1f084 Mon Sep 17 00:00:00 2001 From: jakelevi1996 Date: Thu, 26 Sep 2024 18:53:39 +0100 Subject: [PATCH 2/7] Ensure that padding around the edges of `GridSpecFromSubplotSpec` is not double counted --- lib/matplotlib/_constrained_layout.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/matplotlib/_constrained_layout.py b/lib/matplotlib/_constrained_layout.py index 40bc2f08723d..ff4de5856b35 100644 --- a/lib/matplotlib/_constrained_layout.py +++ b/lib/matplotlib/_constrained_layout.py @@ -54,6 +54,7 @@ from matplotlib import _api, artist as martist import matplotlib.transforms as mtransforms import matplotlib._layoutgrid as mlayoutgrid +import matplotlib.gridspec as mgridspec _log = logging.getLogger(__name__) @@ -326,6 +327,17 @@ def get_margin_from_padding(obj, *, w_pad=0, h_pad=0, 'bottomcb': h_pad, 'topcb': h_pad, 'left': 0, 'right': 0, 'top': 0, 'bottom': 0} + + if isinstance(gs, mgridspec.GridSpecFromSubplotSpec): + if ss.is_first_col(): + margin['leftcb'] = 0 + if ss.is_last_col(): + margin['rightcb'] = 0 + if ss.is_first_row(): + margin['topcb'] = 0 + if ss.is_last_row(): + margin['bottomcb'] = 0 + if _wspace / ncols > w_pad: if ss.colspan.start > 0: margin['leftcb'] = _wspace / ncols From 48239ff8ac9edb38872be19bd10f4afbb3515bbb Mon Sep 17 00:00:00 2001 From: jakelevi1996 Date: Thu, 26 Sep 2024 19:48:40 +0100 Subject: [PATCH 3/7] Add unit test `test_gridspecfromsubplotspec_wspace_hspace` --- .../gridspecfromsubplotspec_wspace.png | Bin 0 -> 25275 bytes .../tests/test_constrainedlayout.py | 26 ++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_wspace.png diff --git a/lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_wspace.png b/lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_wspace.png new file mode 100644 index 0000000000000000000000000000000000000000..9deaddc54d0c9f42f55afe73f4e8b5f5ed80329f GIT binary patch literal 25275 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 BAiw|s literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py index e42e2ee9bfd8..453b2749a99d 100644 --- a/lib/matplotlib/tests/test_constrainedlayout.py +++ b/lib/matplotlib/tests/test_constrainedlayout.py @@ -719,3 +719,29 @@ def test_layout_leak(): gc.collect() assert not any(isinstance(obj, mpl._layoutgrid.LayoutGrid) for obj in gc.get_objects()) + + +@image_comparison(['gridspecfromsubplotspec_wspace.png']) +def test_gridspecfromsubplotspec_wspace_hspace(): + fig = plt.figure(figsize=[10, 6], layout="constrained") + a0, a1 = fig.subplots( + nrows=1, + ncols=2, + gridspec_kw={"wspace": 0.3, "hspace": 0.3}, + width_ratios=[2, 1], + ) + + for axis in [a0, a1]: + axis.get_xaxis().set_visible(False) + axis.get_yaxis().set_visible(False) + for s in axis.spines.values(): + s.set(color="r", lw=10) + + subplot_spec = axis.get_subplotspec() + subgrid_spec = subplot_spec.subgridspec( + nrows=3, + ncols=3, + wspace=0.1, + hspace=0.1, + ) + axis_array = subgrid_spec.subplots() From 852d4397d313b4c3f75d8254ee4463af138c13ba Mon Sep 17 00:00:00 2001 From: jakelevi1996 Date: Thu, 26 Sep 2024 19:58:52 +0100 Subject: [PATCH 4/7] Add unit test `test_gridspecfromsubplotspec_pad` --- .../gridspecfromsubplotspec_pad.png | Bin 0 -> 9592 bytes .../tests/test_constrainedlayout.py | 28 ++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_pad.png diff --git a/lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_pad.png b/lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_pad.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e2ab2bf677eb24ea81c7fc2de696e3b084fd94 GIT binary patch literal 9592 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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 453b2749a99d..0f9ab169d374 100644 --- a/lib/matplotlib/tests/test_constrainedlayout.py +++ b/lib/matplotlib/tests/test_constrainedlayout.py @@ -745,3 +745,31 @@ def test_gridspecfromsubplotspec_wspace_hspace(): hspace=0.1, ) axis_array = subgrid_spec.subplots() + + +@image_comparison(['gridspecfromsubplotspec_pad.png']) +def test_gridspecfromsubplotspec_pad(): + rng = np.random.default_rng(0) + + def add_subplots(axis, nx, ny): + axis.clear() + axis.set_axis_off() + subplot_spec = axis.get_subplotspec() + subgrid_spec = subplot_spec.subgridspec(nx, ny) + axis_list = subgrid_spec.subplots().flatten().tolist() + for a in axis_list: + show_random_image(a) + + return axis_list + + def show_random_image(axis): + axis.pcolormesh(rng.uniform(0, 1, [10, 10])) + axis.set_axis_off() + + fig = plt.figure(figsize=[10, 6], layout="constrained") + fig.get_layout_engine().set(w_pad=0.2, h_pad=0.2) + + axes = fig.subplots(1, 2, width_ratios=[1, 2]) + show_random_image(axes[0]) + axes = add_subplots(axes[1], 2, 2) + axes = add_subplots(axes[1], 2, 2) From 559dddb9859cb1c6633d0c8b8759688ab0d76afb Mon Sep 17 00:00:00 2001 From: jakelevi1996 Date: Thu, 26 Sep 2024 21:00:46 +0100 Subject: [PATCH 5/7] Restore previous appearance by using nested gridspecs --- lib/matplotlib/tests/test_constrainedlayout.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py index 0f9ab169d374..690b97b04cca 100644 --- a/lib/matplotlib/tests/test_constrainedlayout.py +++ b/lib/matplotlib/tests/test_constrainedlayout.py @@ -211,11 +211,14 @@ def test_constrained_layout10(): def test_constrained_layout11(): """Test for multiple nested gridspecs""" + def inner_sp(sp): + return gridspec.GridSpecFromSubplotSpec(1, 1, sp)[0] + fig = plt.figure(layout="constrained", figsize=(13, 3)) gs0 = gridspec.GridSpec(1, 2, figure=fig) gsl = gridspec.GridSpecFromSubplotSpec(1, 2, gs0[0]) gsl0 = gridspec.GridSpecFromSubplotSpec(2, 2, gsl[1]) - ax = fig.add_subplot(gs0[1]) + ax = fig.add_subplot(inner_sp(gs0[1])) example_plot(ax, fontsize=9) axs = [] for gs in gsl0: @@ -223,7 +226,7 @@ def test_constrained_layout11(): axs += [ax] pcm = example_pcolor(ax, fontsize=9) fig.colorbar(pcm, ax=axs, shrink=0.6, aspect=70.) - ax = fig.add_subplot(gsl[0]) + ax = fig.add_subplot(inner_sp(gsl[0])) example_plot(ax, fontsize=9) @@ -231,11 +234,14 @@ def test_constrained_layout11(): def test_constrained_layout11rat(): """Test for multiple nested gridspecs with width_ratios""" + def inner_sp(sp): + return gridspec.GridSpecFromSubplotSpec(1, 1, sp)[0] + fig = plt.figure(layout="constrained", figsize=(10, 3)) gs0 = gridspec.GridSpec(1, 2, figure=fig, width_ratios=[6, 1]) gsl = gridspec.GridSpecFromSubplotSpec(1, 2, gs0[0]) gsl0 = gridspec.GridSpecFromSubplotSpec(2, 2, gsl[1], height_ratios=[2, 1]) - ax = fig.add_subplot(gs0[1]) + ax = fig.add_subplot(inner_sp(gs0[1])) example_plot(ax, fontsize=9) axs = [] for gs in gsl0: @@ -243,7 +249,7 @@ def test_constrained_layout11rat(): axs += [ax] pcm = example_pcolor(ax, fontsize=9) fig.colorbar(pcm, ax=axs, shrink=0.6, aspect=70.) - ax = fig.add_subplot(gsl[0]) + ax = fig.add_subplot(inner_sp(gsl[0])) example_plot(ax, fontsize=9) From d20373e183e96b7eebf038939c70835085fe1dfd Mon Sep 17 00:00:00 2001 From: jakelevi1996 Date: Thu, 26 Sep 2024 21:06:28 +0100 Subject: [PATCH 6/7] Turn off axis ticks --- .../gridspecfromsubplotspec_wspace.png | Bin 25275 -> 5260 bytes .../tests/test_constrainedlayout.py | 3 +++ 2 files changed, 3 insertions(+) diff --git a/lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_wspace.png b/lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_wspace.png index 9deaddc54d0c9f42f55afe73f4e8b5f5ed80329f..1d41000aaabbb933646422172337b101dac7e71f 100644 GIT binary patch literal 5260 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 BAiw|s diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py index 690b97b04cca..44c20363046b 100644 --- a/lib/matplotlib/tests/test_constrainedlayout.py +++ b/lib/matplotlib/tests/test_constrainedlayout.py @@ -751,6 +751,9 @@ def test_gridspecfromsubplotspec_wspace_hspace(): hspace=0.1, ) axis_array = subgrid_spec.subplots() + for a in axis_array.flat: + a.get_xaxis().set_visible(False) + a.get_yaxis().set_visible(False) @image_comparison(['gridspecfromsubplotspec_pad.png']) From 694b919168fe7a1ce1101cfaf0c4b8946185b038 Mon Sep 17 00:00:00 2001 From: jakelevi1996 Date: Thu, 26 Sep 2024 21:15:04 +0100 Subject: [PATCH 7/7] Use deterministic image, and specify colour map --- .../gridspecfromsubplotspec_pad.png | Bin 9592 -> 5319 bytes .../tests/test_constrainedlayout.py | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_pad.png b/lib/matplotlib/tests/baseline_images/test_constrainedlayout/gridspecfromsubplotspec_pad.png index f1e2ab2bf677eb24ea81c7fc2de696e3b084fd94..939765354041a72894e0baea05b551ad640f2f48 100644 GIT binary patch literal 5319 zcmd5=3sBSd9sl#FKy8gmC#RD~=e%4UBTlP^M-26}=u|RlYhecjRA8o<1QL0KKqAF; z9xbw+2VIHDu1;`3D}zyBfh5BMZ7EP?pvWU30ci|*ATa?#l70WlwA`U3Je|ckcfFrhaT&$tBLOU)uL&p%b?7it6O4 zg3x{5uO5CW?v;elZL5a)*;fjy`)L`Uez7Ubyj78+eTPp`+aMv8$2S; z-f&s(8U$BYcP3oj*TSxlwSM0@A&6h-UtAC*lp6{kcgtJL}OC7=MsxES ze*vv^$xEaAl^i=G5`V&{|JyJ_Wi`JaJx=ml7kd;lg&#}V_+ChU>~c0ONn}BJAw9!o z*GsXRYa4=&kTMEuRK{-4f~;KxnS$4rP&whxdSl*MvN1stkGpKnE<$|m7q`>9J&&tT zXaxZ$<%;?rlU7vb6j-Oc{CfAcWrL0hTRMa-yw}$t2 z_4Pe8DLqsVDJ(=X*0p*LB6V9e2*PV5Q^kB(nwq{z`m;&45gHgFJ@ROAx%`}H+CouY zJmu7{5-L5|l9nOsmi7ltMF=u`gMA?wdb416~BohAqy)zs|O;Q&>h6Wf2=TFvuxQl<_+!}iBP-9LYV51W! zC6OX))uZvOW{SGZ4XNbfQs$w_k(NGQxHCrpC)#0712T+jJ4>;=kQHP?dOx`gyZNE~ z`dGK8&q%u|U+IDES^z4(>)q(NIl^po!=gLhrP#{5Emw)w*GvGvU&wx30VE_i4q!pH zQLFUOS$ScWckPUhoAA=#Ad!D*{-b{!W7OEX;c|>vz?VofcM(9?Y9}0_*h)wt%At@U zTpbzu_}QRlJ0ZS@uN^uHPiO$NO70>ES-9gcp$cc594ps4C&d*ol#cU$s9Oh1}kIh!P!N4NDaq~P)BA31o z!fO2o;NmC=Php(hM9jK3KI58`cC$k1$~&YWgKy?{Kv1|^@o zTFm%iffeyN8;tRkI_Pmm;g}FKt6(OPC0X|bVI<2z#d7ebY!I%&0a_W5+M-EjIV0>H zizr2xWji~fRP-^NU601*;2PN8Bdwg@<){1q1=)z1ZZPTdu23~~(8p7p^xcHvk-&@Xk%}n&vSe#F$_&}x zY~>7J^WqQ$e4QV8h`f^C=A%^$IV2KtFa`IPJmi7+!Llk|qU52O6QV=x%$6t#HT`40 z#4SYHR08Thm52tm3dN6`$^uMZVrIT`1cS&XG?q!VKCfqn!PyN~V5x5?0lE0E=r-Zo z2k~u9`1h2;rK->pYn!Xk3+&#mb0u0xyp_GSOkEx`ZthO_)+V8`yiqDo5xe;d-QZHQ z`|iUWSyvsd$Z~K4y;cZabBjh953cS01jek~oMO}O4+Nr5pdlp{kagb)7UmEM@lCdA z!6^4nS8O)QtIliRe3oS_tASO2_CX{H`$#~!OcsF^QTp3qD?NA7$o>rRB}r6bW+ytP zZ~1=hOdXoZdd+Tr2(oSwYX3A8+On&UwywVz1|?PgAcW!anCO{FLAAh#o|lzUBupvD zO6k3oe&uXL8ISpnO8syVHfEmbOn`bE5J0S!-LRaP0{~fxjqGnt;V9@CN zw8z+w&QErSM%E5Hu8-Un4kic@3;|4KQ>tmb z>t2~{u7ZDQ^5z#8Hvt(!)@>RdHv-1aGQ^ib15CmirN{mTucU^bj@5e+aVx;dXVVpQ zGU2wFs3sL?7Hi@*q^}CYsJTV&`sqM^&A>;Dfqa42|E>J$uAAVdTn7=OD(!ikG1uz+ YllEg_cOq)hX#zQPAbkJl`{Hu{1K>Zbe*gdg literal 9592 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 diff --git a/lib/matplotlib/tests/test_constrainedlayout.py b/lib/matplotlib/tests/test_constrainedlayout.py index 44c20363046b..2936a1445f5d 100644 --- a/lib/matplotlib/tests/test_constrainedlayout.py +++ b/lib/matplotlib/tests/test_constrainedlayout.py @@ -758,8 +758,6 @@ def test_gridspecfromsubplotspec_wspace_hspace(): @image_comparison(['gridspecfromsubplotspec_pad.png']) def test_gridspecfromsubplotspec_pad(): - rng = np.random.default_rng(0) - def add_subplots(axis, nx, ny): axis.clear() axis.set_axis_off() @@ -772,7 +770,8 @@ def add_subplots(axis, nx, ny): return axis_list def show_random_image(axis): - axis.pcolormesh(rng.uniform(0, 1, [10, 10])) + z = np.linspace(0, 1, 30).reshape(10, 3) + axis.pcolormesh(z, cmap="plasma") axis.set_axis_off() fig = plt.figure(figsize=[10, 6], layout="constrained")