From 65bedc5c8eb87824e46859deadbec079a3a3c63c Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Fri, 12 Oct 2018 15:51:44 -0700 Subject: [PATCH] FIX: errors in get_position changes --- lib/matplotlib/axes/_base.py | 6 ++-- lib/matplotlib/figure.py | 6 ++-- lib/matplotlib/tests/test_axes.py | 13 +++++++++ lib/mpl_toolkits/axes_grid1/axes_size.py | 6 ++-- lib/mpl_toolkits/axes_grid1/parasite_axes.py | 5 ++-- .../test_axes_grid1/image_grid.png | Bin 0 -> 3872 bytes lib/mpl_toolkits/tests/test_axes_grid1.py | 26 ++++++++++++++++++ 7 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 lib/mpl_toolkits/tests/baseline_images/test_axes_grid1/image_grid.png diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 05a3c824bcbf..3c9357106950 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -839,7 +839,9 @@ def get_position(self, original=False): if original: return self._originalPosition.frozen() else: - self.apply_aspect() + locator = self.get_axes_locator() + if not locator: + self.apply_aspect() return self._position.frozen() def set_position(self, pos, which='both'): @@ -861,7 +863,7 @@ def set_position(self, pos, which='both'): Determines which position variables to change. """ - self._set_position(pos, which='both') + self._set_position(pos, which=which) # because this is being called externally to the library we # zero the constrained layout parts. self._layoutbox = None diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index baed622914bc..fa1a1849142e 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -2271,9 +2271,9 @@ def get_tightbbox(self, renderer, bbox_extra_artists=None): if bbox is not None and (bbox.width != 0 or bbox.height != 0): bb.append(bbox) - for ax in self.axes: - if ax.get_visible(): - bb.append(ax.get_tightbbox(renderer, bbox_extra_artists)) + bb.extend( + ax.get_tightbbox(renderer, bbox_extra_artists=bbox_extra_artists) + for ax in self.axes if ax.get_visible()) if len(bb) == 0: return self.bbox_inches diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index b7b478fa75d9..959121c30a4b 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -5781,6 +5781,19 @@ def test_zoom_inset(): xx, rtol=1e-4) +def test_set_position(): + fig, ax = plt.subplots() + ax.set_aspect(3.) + ax.set_position([0.1, 0.1, 0.4, 0.4], which='both') + assert np.allclose(ax.get_position().width, 0.1) + ax.set_aspect(2.) + ax.set_position([0.1, 0.1, 0.4, 0.4], which='original') + assert np.allclose(ax.get_position().width, 0.15) + ax.set_aspect(3.) + ax.set_position([0.1, 0.1, 0.4, 0.4], which='active') + assert np.allclose(ax.get_position().width, 0.1) + + def test_spines_properbbox_after_zoom(): fig, ax = plt.subplots() bb = ax.spines['bottom'].get_window_extent(fig.canvas.get_renderer()) diff --git a/lib/mpl_toolkits/axes_grid1/axes_size.py b/lib/mpl_toolkits/axes_grid1/axes_size.py index 64558e3393fa..7ca6784ce467 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_size.py +++ b/lib/mpl_toolkits/axes_grid1/axes_size.py @@ -321,6 +321,8 @@ def __init__(self, ax, direction): raise KeyError("direction must be one of left, right, bottom, top") def __call__(self, renderer): - vl = [self._get_func(ax.get_tightbbox(renderer, False), - ax.bbox) for ax in self._ax_list] + vl = [self._get_func(ax.get_tightbbox(renderer, + call_axes_locator=False), + ax.bbox) + for ax in self._ax_list] return max(vl) diff --git a/lib/mpl_toolkits/axes_grid1/parasite_axes.py b/lib/mpl_toolkits/axes_grid1/parasite_axes.py index d003e5c40253..be3570f9b49a 100644 --- a/lib/mpl_toolkits/axes_grid1/parasite_axes.py +++ b/lib/mpl_toolkits/axes_grid1/parasite_axes.py @@ -329,9 +329,10 @@ def _remove_method(h): return ax2 def get_tightbbox(self, renderer, call_axes_locator=True): - bbs = [ax.get_tightbbox(renderer, call_axes_locator) + bbs = [ax.get_tightbbox(renderer, call_axes_locator=call_axes_locator) for ax in self.parasites] - bbs.append(super().get_tightbbox(renderer, call_axes_locator)) + bbs.append(super().get_tightbbox(renderer, + call_axes_locator=call_axes_locator)) return Bbox.union([b for b in bbs if b.width != 0 or b.height != 0]) diff --git a/lib/mpl_toolkits/tests/baseline_images/test_axes_grid1/image_grid.png b/lib/mpl_toolkits/tests/baseline_images/test_axes_grid1/image_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a2aae5607e2284bf63a86c15d6b9e07d7676ea GIT binary patch literal 3872 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 literal 0 HcmV?d00001 diff --git a/lib/mpl_toolkits/tests/test_axes_grid1.py b/lib/mpl_toolkits/tests/test_axes_grid1.py index 896ba503f91f..2ac9d7d089fb 100644 --- a/lib/mpl_toolkits/tests/test_axes_grid1.py +++ b/lib/mpl_toolkits/tests/test_axes_grid1.py @@ -5,6 +5,7 @@ from mpl_toolkits.axes_grid1 import host_subplot from mpl_toolkits.axes_grid1 import make_axes_locatable from mpl_toolkits.axes_grid1 import AxesGrid +from mpl_toolkits.axes_grid1 import ImageGrid from mpl_toolkits.axes_grid1.inset_locator import ( zoomed_inset_axes, mark_inset, @@ -381,3 +382,28 @@ def test_anchored_direction_arrows_many_args(): sep_x=-0.06, sep_y=-0.08, back_length=0.1, head_width=9, head_length=10, tail_width=5) ax.add_artist(direction_arrows) + + +def test_axes_locatable_position(): + fig, ax = plt.subplots() + divider = make_axes_locatable(ax) + cax = divider.append_axes('right', size='5%', pad='2%') + fig.canvas.draw() + assert np.isclose(cax.get_position(original=False).width, + 0.03621495327102808) + + +@image_comparison(baseline_images=['image_grid'], extensions=['png'], + remove_text=True, style='mpl20', + savefig_kwarg={'bbox_inches': 'tight'}) +def test_image_grid(): + # test that image grid works with bbox_inches=tight. + im = np.arange(100) + im.shape = 10, 10 + + fig = plt.figure(1, (4., 4.)) + grid = ImageGrid(fig, 111, nrows_ncols=(2, 2), axes_pad=0.1) + + for i in range(4): + grid[i].imshow(im) + grid[i].set_title('test {0}{0}'.format(i))