From 6a6a65ed256e7a81b329772a42b46d4786827732 Mon Sep 17 00:00:00 2001 From: hu-xiaonan Date: Mon, 6 Jan 2025 08:22:34 +0000 Subject: [PATCH 1/2] fix #29410 --- lib/matplotlib/axes/_base.py | 2 +- lib/matplotlib/tests/test_axes.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 2abab547ff95..7c9b12d3ced3 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -647,7 +647,7 @@ def __init__(self, fig, args = (rect,) subplotspec = None if len(args) == 1 and isinstance(args[0], mtransforms.Bbox): - self._position = args[0] + self._position = args[0].frozen() elif len(args) == 1 and np.iterable(args[0]): self._position = mtransforms.Bbox.from_bounds(*args[0]) else: diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index beac9850539e..a153f04257d1 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -9581,3 +9581,13 @@ def test_bar_color_precedence(): bars = ax.bar([31, 32, 33], [4, 5, 6], color='red', facecolor='green') for bar in bars: assert mcolors.same_color(bar.get_facecolor(), 'green') + + +def test_axes_set_position_external_bbox_unchanged(): + # From #29410: Modifying Axes' position also alters the original Bbox + # object used for initialization + bbox = mtransforms.Bbox([[0.0, 0.0], [1.0, 1.0]]) + fig = plt.figure() + ax = fig.add_axes(bbox) + ax.set_position([0.25, 0.25, 0.5, 0.5]) + assert (bbox.x0, bbox.y0, bbox.width, bbox.height) == (0.0, 0.0, 1.0, 1.0) From 882c3f576ad876f4b03401a1283b59114704589a Mon Sep 17 00:00:00 2001 From: hu-xiaonan <152783907+hu-xiaonan@users.noreply.github.com> Date: Fri, 10 Jan 2025 20:16:26 +0800 Subject: [PATCH 2/2] Update test_axes_set_position_external_bbox_unchanged to use figure comparison --- lib/matplotlib/tests/test_axes.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index a153f04257d1..854068d0d03c 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -9583,11 +9583,12 @@ def test_bar_color_precedence(): assert mcolors.same_color(bar.get_facecolor(), 'green') -def test_axes_set_position_external_bbox_unchanged(): +@check_figures_equal(extensions=['png']) +def test_axes_set_position_external_bbox_unchanged(fig_test, fig_ref): # From #29410: Modifying Axes' position also alters the original Bbox # object used for initialization bbox = mtransforms.Bbox([[0.0, 0.0], [1.0, 1.0]]) - fig = plt.figure() - ax = fig.add_axes(bbox) - ax.set_position([0.25, 0.25, 0.5, 0.5]) + ax_test = fig_test.add_axes(bbox) + ax_test.set_position([0.25, 0.25, 0.5, 0.5]) assert (bbox.x0, bbox.y0, bbox.width, bbox.height) == (0.0, 0.0, 1.0, 1.0) + ax_ref = fig_ref.add_axes([0.25, 0.25, 0.5, 0.5])