diff --git a/lib/matplotlib/_tight_bbox.py b/lib/matplotlib/_tight_bbox.py index e0fba389d120..db72bbdff020 100644 --- a/lib/matplotlib/_tight_bbox.py +++ b/lib/matplotlib/_tight_bbox.py @@ -23,7 +23,10 @@ def adjust_bbox(fig, bbox_inches, fixed_dpi=None): locator_list = [] sentinel = object() for ax in fig.axes: - locator_list.append(ax.get_axes_locator()) + locator = ax.get_axes_locator() + if locator is not None: + ax.apply_aspect(locator(ax, None)) + locator_list.append(locator) current_pos = ax.get_position(original=False).frozen() ax.set_axes_locator(lambda a, r, _pos=current_pos: _pos) # override the method that enforces the aspect ratio on the Axes diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py index f3ece07660e3..8c31e79082ce 100644 --- a/lib/matplotlib/tests/test_figure.py +++ b/lib/matplotlib/tests/test_figure.py @@ -532,13 +532,24 @@ def test_savefig_pixel_ratio(backend): assert ratio1 == ratio2 -def test_savefig_preserve_layout_engine(tmp_path): +def test_savefig_preserve_layout_engine(): fig = plt.figure(layout='compressed') - fig.savefig(tmp_path / 'foo.png', bbox_inches='tight') + fig.savefig(io.BytesIO(), bbox_inches='tight') assert fig.get_layout_engine()._compress +def test_savefig_locate_colorbar(): + fig, ax = plt.subplots() + pc = ax.pcolormesh(np.random.randn(2, 2)) + cbar = fig.colorbar(pc, aspect=40) + fig.savefig(io.BytesIO(), bbox_inches=mpl.transforms.Bbox([[0, 0], [4, 4]])) + + # Check that an aspect ratio has been applied. + assert (cbar.ax.get_position(original=True).bounds != + cbar.ax.get_position(original=False).bounds) + + def test_figure_repr(): fig = plt.figure(figsize=(10, 20), dpi=10) assert repr(fig) == "
"