From b39bd9d8bb4fb2c59c5e4f46e7df70955168e12e Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Mon, 23 Jul 2018 10:22:51 -0700 Subject: [PATCH 1/3] FIX: Apply aspect before drawing starts --- lib/matplotlib/axes/_base.py | 6 ------ lib/matplotlib/figure.py | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index cd6a5843f424..89896cd6aac9 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -2546,12 +2546,6 @@ def draw(self, renderer=None, inframe=False): # prevent triggering call backs during the draw process self._stale = True - locator = self.get_axes_locator() - if locator: - pos = locator(self, renderer) - self.apply_aspect(pos) - else: - self.apply_aspect() artists = self.get_children() artists.remove(self.patch) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index c86672c95dc9..6b61237ae1e0 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1630,6 +1630,23 @@ def draw(self, renderer): if not artist.get_animated()), key=lambda artist: artist.get_zorder()) + for ax in self.axes: + locator = ax.get_axes_locator() + if locator: + pos = locator(ax, renderer) + ax.apply_aspect(pos) + else: + ax.apply_aspect() + + for child in ax.get_children(): + if hasattr(child, 'apply_aspect'): + locator = child.get_axes_locator() + if locator: + pos = locator(child, renderer) + child.apply_aspect(pos) + else: + child.apply_aspect() + try: renderer.open_group('figure') if self.get_constrained_layout() and self.axes: From c72004505f7e92304cabdb979eefa1a6412fa7d4 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Mon, 23 Jul 2018 13:05:04 -0700 Subject: [PATCH 2/3] FIX: add apply_aspect back to _base draw --- lib/matplotlib/axes/_base.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 89896cd6aac9..cd6a5843f424 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -2546,6 +2546,12 @@ def draw(self, renderer=None, inframe=False): # prevent triggering call backs during the draw process self._stale = True + locator = self.get_axes_locator() + if locator: + pos = locator(self, renderer) + self.apply_aspect(pos) + else: + self.apply_aspect() artists = self.get_children() artists.remove(self.patch) From a4e7ddd8584f147083d0ee9e765932877dfb0eaf Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Sat, 29 Sep 2018 16:16:48 -0700 Subject: [PATCH 3/3] TST: add test for first draw having correct annotation position --- .../test_axes/annotate_across_transforms.png | Bin 0 -> 7963 bytes lib/matplotlib/tests/test_axes.py | 17 +++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/annotate_across_transforms.png diff --git a/lib/matplotlib/tests/baseline_images/test_axes/annotate_across_transforms.png b/lib/matplotlib/tests/baseline_images/test_axes/annotate_across_transforms.png new file mode 100644 index 0000000000000000000000000000000000000000..d62245605fc9c8fa8fb6ef2564d064b2bf808d2d GIT binary patch literal 7963 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 YaAj5MYtP!iMmC_QZ3HjYy!ZG&0P0jhK>z>% literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 1b56c74ee3e7..5bc1b54bbf8e 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -5931,3 +5931,20 @@ def test_scatter_empty_data(): # making sure this does not raise an exception plt.scatter([], []) plt.scatter([], [], s=[], c=[]) + + +@image_comparison(baseline_images=['annotate_across_transforms'], + style='mpl20', extensions=['png'], remove_text=True) +def test_annotate_across_transforms(): + x = np.linspace(0, 10, 200) + y = np.exp(-x) * np.sin(x) + + fig, ax = plt.subplots(figsize=(3.39, 3)) + ax.plot(x, y) + axins = ax.inset_axes([0.4, 0.5, 0.3, 0.3]) + axins.set_aspect(0.2) + axins.xaxis.set_visible(False) + axins.yaxis.set_visible(False) + ax.annotate("", xy=(x[150], y[150]), xycoords=ax.transData, + xytext=(1, 0), textcoords=axins.transAxes, + arrowprops=dict(arrowstyle="->"))