Note
Go to the end to download the full example code.
Unequal padding on each side of a group
pad is a single number on every other example in this gallery – the
same clearance on all four sides. It also accepts a (left, right, top,
bottom) sequence for unequal padding, useful exactly when a group’s own
edges don’t all mean the same thing: the two groups below sit right next to
each other, sharing one boundary in the middle of the figure and each
carrying a title on their own outer top edge.
A single scalar pad big enough for the title clearance both groups need
would also push their shared inner boundary apart by the same amount, even
though nothing is there to clear – wasted canvas, and the two groups read
as farther apart than they should. Tightening just that one side (left
for “After”, right for “Before”) while keeping the title-facing top
generous does what a single number can’t: the two boxes visibly touch in
the middle, without either title crowding its own plots.

This figure has 8 panels — too many to usefully embed at a fixed size.
Open the full interactive example in a new page to pick a tool, then zoom, pan, point-pick or annotate any panel.
View this figure’s Vega export ↗ — the raw JSON spec, rendered live by a real Vega engine.
View this figure’s Vega-Lite export ↗ — the raw JSON spec(s), rendered live by a real Vega-Lite engine.
import numpy as np
import plotpress
rng = np.random.default_rng(3)
x = np.linspace(0, 6, 17)
y = np.linspace(0, 4, 13)
X, Y = np.meshgrid(x, y)
fig, axes = plotpress.subplots(2, 4, figsize=(12, 6))
for r in range(2):
for c in range(4):
phase = c * 0.5
Z = np.sin(X + phase - r) * np.cos(Y - phase) + 0.05 * rng.standard_normal(X.shape)
axes[r, c].pcolormesh(x, y, Z, cmap="viridis", vmin=-1.2, vmax=1.2)
axes[r, c].tick_params(labelsize=6)
# (left, right, top, bottom) -- tight on the side facing the other group,
# generous everywhere else, including the top each title needs.
fig.group("Before", list(axes[:, 0:2].ravel()), title_position="top",
color="#1f77b4", pad=(20.0, 4.0, 24.0, 8.0))
fig.group("After", list(axes[:, 2:4].ravel()), title_position="top",
color="#d62728", pad=(4.0, 20.0, 24.0, 8.0))
# The shared boundary is interior to the grid and neither title faces it,
# so tight_layout() won't widen it on its own -- group_spacing() reserves
# just enough room for the two tightened (4px) inner edges to clear each
# other without colliding.
fig.group_spacing(wspace=10.0)
fig.tight_layout()
Total running time of the script: (0 minutes 0.277 seconds)