Skip to content

Commit 85eadb3

Browse files
authored
Merge pull request matplotlib#25883 from anntzer/cbcl
Check gridspecness of colorbars on the right figure.
2 parents ca29425 + 48aa894 commit 85eadb3

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

lib/matplotlib/figure.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,32 +1279,36 @@ def colorbar(
12791279
if ax is None:
12801280
ax = getattr(mappable, "axes", None)
12811281

1282-
if (self.get_layout_engine() is not None and
1283-
not self.get_layout_engine().colorbar_gridspec):
1284-
use_gridspec = False
12851282
if cax is None:
12861283
if ax is None:
12871284
raise ValueError(
12881285
'Unable to determine Axes to steal space for Colorbar. '
12891286
'Either provide the *cax* argument to use as the Axes for '
12901287
'the Colorbar, provide the *ax* argument to steal space '
12911288
'from it, or add *mappable* to an Axes.')
1292-
current_ax = self.gca()
1289+
fig = ( # Figure of first axes; logic copied from make_axes.
1290+
[*ax.flat] if isinstance(ax, np.ndarray)
1291+
else [*ax] if np.iterable(ax)
1292+
else [ax])[0].figure
1293+
current_ax = fig.gca()
1294+
if (fig.get_layout_engine() is not None and
1295+
not fig.get_layout_engine().colorbar_gridspec):
1296+
use_gridspec = False
12931297
if (use_gridspec
12941298
and isinstance(ax, mpl.axes._base._AxesBase)
12951299
and ax.get_subplotspec()):
12961300
cax, kwargs = cbar.make_axes_gridspec(ax, **kwargs)
12971301
else:
12981302
cax, kwargs = cbar.make_axes(ax, **kwargs)
12991303
# make_axes calls add_{axes,subplot} which changes gca; undo that.
1300-
self.sca(current_ax)
1304+
fig.sca(current_ax)
13011305
cax.grid(visible=False, which='both', axis='both')
13021306

13031307
NON_COLORBAR_KEYS = [ # remove kws that cannot be passed to Colorbar
13041308
'fraction', 'pad', 'shrink', 'aspect', 'anchor', 'panchor']
13051309
cb = cbar.Colorbar(cax, mappable, **{
13061310
k: v for k, v in kwargs.items() if k not in NON_COLORBAR_KEYS})
1307-
self.stale = True
1311+
cax.figure.stale = True
13081312
return cb
13091313

13101314
def subplots_adjust(self, left=None, bottom=None, right=None, top=None,

lib/matplotlib/tests/test_colorbar.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,3 +1217,16 @@ def test_colorbar_axes_parmeters():
12171217
fig.colorbar(im, ax=(ax[0], ax[1]))
12181218
fig.colorbar(im, ax={i: _ax for i, _ax in enumerate(ax)}.values())
12191219
fig.draw_without_rendering()
1220+
1221+
1222+
def test_colorbar_wrong_figure():
1223+
# If we decide in the future to disallow calling colorbar() on the "wrong" figure,
1224+
# just delete this test.
1225+
fig_tl = plt.figure(layout="tight")
1226+
fig_cl = plt.figure(layout="constrained")
1227+
im = fig_cl.add_subplot().imshow([[0, 1]])
1228+
# Make sure this doesn't try to setup a gridspec-controlled colorbar on fig_cl,
1229+
# which would crash CL.
1230+
fig_tl.colorbar(im)
1231+
fig_tl.draw_without_rendering()
1232+
fig_cl.draw_without_rendering()

0 commit comments

Comments
 (0)