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

+10-5
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

+11-8
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)