From 162239fe7323831b71973d38c6b9e05855e0d8b8 Mon Sep 17 00:00:00 2001 From: Matt Shen Date: Tue, 20 Jan 2015 17:03:56 +0100 Subject: [PATCH] Fix negative annotations xycoords. Use top-right as translation reference point when xycoords are given in "point" or "pixel" and x or y are negative. Logic based on _get_xy_legacy removed in a65151be33b7b50fd9f40c72c5b3e965685cc13b. --- .../test_text/annotation_negative_coords.pdf | Bin 0 -> 7411 bytes .../test_text/annotation_negative_coords.png | Bin 0 -> 18308 bytes .../test_text/annotation_negative_coords.svg | 694 ++++++++++++++++++ lib/matplotlib/tests/test_text.py | 16 + lib/matplotlib/text.py | 23 +- 5 files changed, 727 insertions(+), 6 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.png create mode 100644 lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.svg diff --git a/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.pdf b/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e54d7738f739e5a09d8239456029e80041a54f3d GIT binary patch literal 7411 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 gyZis;7vt;)K8y%I?_K+Vff^8f$< literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.svg b/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.svg new file mode 100644 index 000000000000..100993c9eded --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.svg @@ -0,0 +1,694 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_text.py b/lib/matplotlib/tests/test_text.py index f82ab5142d62..eecb65621b5c 100644 --- a/lib/matplotlib/tests/test_text.py +++ b/lib/matplotlib/tests/test_text.py @@ -284,3 +284,19 @@ def test_bbox_clipping(): plt.text(0.9, 0.2, 'Is bbox clipped?', backgroundcolor='r', clip_on=True) t = plt.text(0.9, 0.5, 'Is fancy bbox clipped?', clip_on=True) t.set_bbox({"boxstyle": "round, pad=0.1"}) + + +@image_comparison(baseline_images=['annotation_negative_coords']) +def test_annotation_negative_coords(): + fig = plt.figure() + ax = plt.subplot( 1, 1, 1 ) + + ax.annotate("+fpt", (15, 40), xycoords="figure points") + ax.annotate("+fpx", (25, 30), xycoords="figure pixels") + ax.annotate("+apt", (35, 20), xycoords="axes points") + ax.annotate("+apx", (45, 10), xycoords="axes pixels") + + ax.annotate("-fpt", (-55, -40), xycoords="figure points") + ax.annotate("-fpx", (-45, -30), xycoords="figure pixels") + ax.annotate("-apt", (-35, -20), xycoords="axes points") + ax.annotate("-apx", (-25, -10), xycoords="axes pixels") diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 1b86d4597801..e1a43c64d43e 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1531,17 +1531,17 @@ def _get_xy(self, renderer, x, y, s): if s2 == 'data': y = float(self.convert_yunits(y)) - tr = self._get_xy_transform(renderer, s) + tr = self._get_xy_transform(renderer, (x, y), s) x1, y1 = tr.transform_point((x, y)) return x1, y1 - def _get_xy_transform(self, renderer, s): + def _get_xy_transform(self, renderer, xy, s): if isinstance(s, tuple): s1, s2 = s from matplotlib.transforms import blended_transform_factory - tr1 = self._get_xy_transform(renderer, s1) - tr2 = self._get_xy_transform(renderer, s2) + tr1 = self._get_xy_transform(renderer, xy, s1) + tr2 = self._get_xy_transform(renderer, xy, s2) tr = blended_transform_factory(tr1, tr2) return tr @@ -1590,7 +1590,17 @@ def _get_xy_transform(self, renderer, s): # bbox0 = self._get_bbox(renderer, bbox) if bbox0 is not None: - xy0 = bbox0.bounds[:2] + x, y = xy + bounds = bbox0.extents + if x < 0: + x0 = bounds[2] + else: + x0 = bounds[0] + if y < 0: + y0 = bounds[3] + else: + y0 = bounds[1] + xy0 = (x0, y0) elif bbox_name == "offset": xy0 = self._get_ref_xy(renderer) @@ -1950,7 +1960,8 @@ def _update_position_xytext(self, renderer, xy_pixel): patch. """ # generate transformation, - self.set_transform(self._get_xy_transform(renderer, self.anncoords)) + self.set_transform(self._get_xy_transform( + renderer, self.xy, self.anncoords)) ox0, oy0 = self._get_xy_display() ox1, oy1 = xy_pixel pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy