Skip to content

Commit c39027a

Browse files
committed
ENH: add rect parameter to constrained_layout
1 parent 698397f commit c39027a

File tree

5 files changed

+255
-224
lines changed

5 files changed

+255
-224
lines changed

lib/matplotlib/_constrained_layout.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464

6565
######################################################
6666
def do_constrained_layout(fig, h_pad, w_pad,
67-
hspace=None, wspace=None):
67+
hspace=None, wspace=None, rect=(0, 0, 1, 1)):
6868
"""
6969
Do the constrained_layout. Called at draw time in
7070
``figure.constrained_layout()``
@@ -87,14 +87,18 @@ def do_constrained_layout(fig, h_pad, w_pad,
8787
of 0.1 of the figure width between each column.
8888
If h/wspace < h/w_pad, then the pads are used instead.
8989
90+
rect : tuple of 4 floats
91+
Rectangle in figure coordinates to perform constrained layout in
92+
[left, bottom, width, height], each from 0-1.
93+
9094
Returns
9195
-------
9296
layoutgrid : private debugging structure
9397
"""
9498

9599
renderer = _get_renderer(fig)
96100
# make layoutgrid tree...
97-
layoutgrids = make_layoutgrids(fig, None)
101+
layoutgrids = make_layoutgrids(fig, None, rect=rect)
98102
if not layoutgrids['hasgrids']:
99103
_api.warn_external('There are no gridspecs with layoutgrids. '
100104
'Possibly did not call parent GridSpec with the'
@@ -133,7 +137,7 @@ def do_constrained_layout(fig, h_pad, w_pad,
133137
return layoutgrids
134138

135139

136-
def make_layoutgrids(fig, layoutgrids):
140+
def make_layoutgrids(fig, layoutgrids, rect=[0, 0, 1, 1]):
137141
"""
138142
Make the layoutgrid tree.
139143
@@ -147,8 +151,9 @@ def make_layoutgrids(fig, layoutgrids):
147151
layoutgrids = dict()
148152
layoutgrids['hasgrids'] = False
149153
if not hasattr(fig, '_parent'):
150-
# top figure
151-
layoutgrids[fig] = mlayoutgrid.LayoutGrid(parent=None, name='figlb')
154+
# top figure; pass rect as parent to allow user-specified
155+
# margins
156+
layoutgrids[fig] = mlayoutgrid.LayoutGrid(parent=rect, name='figlb')
152157
else:
153158
# subfigure
154159
gs = fig._subplotspec.get_gridspec()

lib/matplotlib/_layoutgrid.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def __init__(self, parent=None, parent_pos=(0, 0),
3939
self.parent_pos = parent_pos
4040
self.parent_inner = parent_inner
4141
self.name = name + seq_id()
42-
if parent is not None:
42+
if isinstance(parent, LayoutGrid):
4343
self.name = f'{parent.name}.{self.name}'
4444
self.nrows = nrows
4545
self.ncols = ncols
@@ -51,8 +51,10 @@ def __init__(self, parent=None, parent_pos=(0, 0),
5151
self.width_ratios = np.ones(ncols)
5252

5353
sn = self.name + '_'
54-
if parent is None:
55-
self.parent = None
54+
if not isinstance(parent, LayoutGrid):
55+
# parent can be a rect if not a LayoutGrid
56+
# allows specifying a rectangle to contain the layout.
57+
self.parent = parent
5658
self.solver = kiwi.Solver()
5759
else:
5860
self.parent = parent
@@ -178,12 +180,13 @@ def parent_constraints(self):
178180
# parent's left, the last column right equal to the
179181
# parent's right...
180182
parent = self.parent
181-
if parent is None:
182-
hc = [self.lefts[0] == 0,
183-
self.rights[-1] == 1,
183+
if not isinstance(parent, LayoutGrid):
184+
# specify a rectangle in figure coordinates
185+
hc = [self.lefts[0] == parent[0],
186+
self.rights[-1] == parent[0] + parent[2],
184187
# top and bottom reversed order...
185-
self.tops[0] == 1,
186-
self.bottoms[-1] == 0]
188+
self.tops[0] == parent[1] + parent[3],
189+
self.bottoms[-1] == parent[1]]
187190
else:
188191
rows, cols = self.parent_pos
189192
rows = np.atleast_1d(rows)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy