From e4697e778adf9ea2f3bc0fad5efb15bd1c365b3d Mon Sep 17 00:00:00 2001 From: apodemus Date: Wed, 22 Nov 2017 14:18:20 +0200 Subject: [PATCH 01/18] add Annulus patch --- lib/matplotlib/patches.py | 98 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index a5bb2019db56..0056efb5c0f1 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1552,9 +1552,103 @@ def get_angle(self): angle = property(get_angle, set_angle) -class Circle(Ellipse): - """A circle patch.""" +class Annulus(Patch): + """ + An elliptical annulus. + """ + + def __str__(self): + if self.a == self.b: + fmt = "Annulus(xy=(%s, %s), r=%s, width=%s, angle=%s)" + pars = (self.center[0], self.center[1], + self.a, self.width, self.angle) + else: + fmt = "Annulus(xy=(%s, %s), a=%s, b=%s, width=%s, angle=%s)" + pars = (self.center[0], self.center[1], + self.a, self.b, self.width, self.angle) + return fmt % pars + + @docstring.dedent_interpd + def __init__(self, xy, r, width, angle=0.0, **kwargs): + """ + *xy* + center of annulus + + *r* + if float: + radius of the outer circle + if array-like of size 2: + semi-major and -minor axes of outer ellipse + + *width* + width of the annulus + + *angle* + rotation in degrees (anti-clockwise) + + Valid kwargs are: + %(Patch)s + """ + Patch.__init__(self, **kwargs) + + if np.size(r) == 2: + self.a, self.b = r + elif np.size(r) == 1: + self.a = self.b = float(r) + else: + raise ValueError( + 'r parameter should be either float, or sequence of size 2') + + if min(self.a, self.b) <= width: + raise ValueError( + 'Width should be smaller than semi-minor axis') + + self.center = xy + self.width = width + self.angle = angle + self._path = None + # Note: This cannot be calculated until this is added to an Axes + self._patch_transform = transforms.IdentityTransform() + + def _transform_verts(self, verts, a, b): + center = (self.convert_xunits(self.center[0]), + self.convert_yunits(self.center[1])) + a = self.convert_xunits(a) + b = self.convert_yunits(b) + tr = transforms.Affine2D() \ + .scale(a, b) \ + .rotate_deg(self.angle) \ + .translate(*center) + + return tr.transform(verts) + + def _recompute_path(self): + + # circular arc + arc = Path.arc(0, 360) + + # annulus needs to draw the outer ring + # followed by a reversed and scaled inner ring + a, b, w = self.a, self.b, self.width + v1 = self._transform_verts(arc.vertices, a, b) + v2 = self._transform_verts(arc.vertices[::-1], a - w, b - w) + v = np.vstack([v1, v2, v1[0, :], (0, 0)]) + c = np.hstack([arc.codes, arc.codes, Path.MOVETO, Path.CLOSEPOLY]) + c[len(arc.codes)] = Path.MOVETO + + self._path = Path(v, c) + + def get_path(self): + if self._path is None: + self._recompute_path() + return self._path + + +class Circle(Ellipse): + """ + A circle patch. + """ def __str__(self): pars = self.center[0], self.center[1], self.radius fmt = "Circle(xy=(%g, %g), radius=%g)" From a05fb1e228eb56aa8a00431da4143c253ae1fdfe Mon Sep 17 00:00:00 2001 From: apodemus Date: Thu, 30 Nov 2017 10:28:24 +0200 Subject: [PATCH 02/18] 'add Annulus patch for making elliptical annuli' --- lib/matplotlib/patches.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 0056efb5c0f1..d02f023dbeb6 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1608,8 +1608,6 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): self.width = width self.angle = angle self._path = None - # Note: This cannot be calculated until this is added to an Axes - self._patch_transform = transforms.IdentityTransform() def _transform_verts(self, verts, a, b): center = (self.convert_xunits(self.center[0]), @@ -1624,11 +1622,10 @@ def _transform_verts(self, verts, a, b): return tr.transform(verts) def _recompute_path(self): - # circular arc arc = Path.arc(0, 360) - # annulus needs to draw the outer ring + # annulus needs to draw an outer ring # followed by a reversed and scaled inner ring a, b, w = self.a, self.b, self.width v1 = self._transform_verts(arc.vertices, a, b) From ecd608349bbd3cea757f1abee882fafd4e7ac6e4 Mon Sep 17 00:00:00 2001 From: apodemus Date: Sun, 7 Jan 2018 21:21:46 +0200 Subject: [PATCH 03/18] docstring fixes --- lib/matplotlib/patches.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index d02f023dbeb6..31634f56b769 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1564,7 +1564,7 @@ def __str__(self): pars = (self.center[0], self.center[1], self.a, self.width, self.angle) else: - fmt = "Annulus(xy=(%s, %s), a=%s, b=%s, width=%s, angle=%s)" + fmt = "Annulus(xy=(%s, %s), r=(%s, %s), width=%s, angle=%s)" pars = (self.center[0], self.center[1], self.a, self.b, self.width, self.angle) return fmt % pars @@ -1572,20 +1572,20 @@ def __str__(self): @docstring.dedent_interpd def __init__(self, xy, r, width, angle=0.0, **kwargs): """ - *xy* - center of annulus + xy : array_like + center of annulus - *r* - if float: - radius of the outer circle - if array-like of size 2: - semi-major and -minor axes of outer ellipse + r : scalar or 1D array_like + The radius, or semi-major axes + - If float: radius of the outer circle + - If array_like of size 2: semi-major and -minor axes of outer ellipse - *width* + width : float width of the annulus - *angle* - rotation in degrees (anti-clockwise) + angle: float, optional + rotation in degrees (anti-clockwise). Ignored for circular annuli (`r` is a scalar) + Valid kwargs are: %(Patch)s @@ -1602,7 +1602,7 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): if min(self.a, self.b) <= width: raise ValueError( - 'Width should be smaller than semi-minor axis') + 'Width of annulus should be smaller than semi-minor axis') self.center = xy self.width = width From bd3f498d03d63a0244fe8f5133201c661b5e22f5 Mon Sep 17 00:00:00 2001 From: apodemus Date: Mon, 8 Jan 2018 12:55:55 +0200 Subject: [PATCH 04/18] better str repr --- lib/matplotlib/patches.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 31634f56b769..5e9887abb4a5 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1560,14 +1560,12 @@ class Annulus(Patch): def __str__(self): if self.a == self.b: - fmt = "Annulus(xy=(%s, %s), r=%s, width=%s, angle=%s)" - pars = (self.center[0], self.center[1], - self.a, self.width, self.angle) + r = str(self.a) else: - fmt = "Annulus(xy=(%s, %s), r=(%s, %s), width=%s, angle=%s)" - pars = (self.center[0], self.center[1], - self.a, self.b, self.width, self.angle) - return fmt % pars + r = '(%s, %s)' % (self.a, self.b) + + return "Annulus(xy=(%s, %s), r=%s, width=%s, angle=%s)" % \ + (self.center[0], self.center[1], r, self.width, self.angle) @docstring.dedent_interpd def __init__(self, xy, r, width, angle=0.0, **kwargs): @@ -1598,7 +1596,7 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): self.a = self.b = float(r) else: raise ValueError( - 'r parameter should be either float, or sequence of size 2') + 'r parameter should be either float, or array_like of size 2') if min(self.a, self.b) <= width: raise ValueError( From e1f863ea2f259a6eb061ec78318d2143d66f4368 Mon Sep 17 00:00:00 2001 From: apodemus Date: Mon, 8 Jan 2018 14:29:23 +0200 Subject: [PATCH 05/18] add what's new entry --- doc/users/next_whats_new/annulus.rst | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 doc/users/next_whats_new/annulus.rst diff --git a/doc/users/next_whats_new/annulus.rst b/doc/users/next_whats_new/annulus.rst new file mode 100644 index 000000000000..03e0d934ea7a --- /dev/null +++ b/doc/users/next_whats_new/annulus.rst @@ -0,0 +1,4 @@ +Add ``Annulus`` patch +--------------------- + +A new class for drawing elliptical annuli. From ad81c4b97d548dbbc393a6b361b39c861e6a3991 Mon Sep 17 00:00:00 2001 From: apodemus Date: Mon, 8 Jan 2018 17:59:30 +0200 Subject: [PATCH 06/18] add image test --- .../baseline_images/test_patches/annulus.png | Bin 0 -> 84457 bytes lib/matplotlib/tests/test_patches.py | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_patches/annulus.png diff --git a/lib/matplotlib/tests/baseline_images/test_patches/annulus.png b/lib/matplotlib/tests/baseline_images/test_patches/annulus.png new file mode 100644 index 0000000000000000000000000000000000000000..549443f523cfcf521a6abb5dbe14f336c7d42636 GIT binary patch literal 84457 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_patches.py b/lib/matplotlib/tests/test_patches.py index 2a908098364e..46160f693278 100644 --- a/lib/matplotlib/tests/test_patches.py +++ b/lib/matplotlib/tests/test_patches.py @@ -626,3 +626,16 @@ def test_default_capstyle(): def test_default_joinstyle(): patch = Patch() assert patch.get_joinstyle() == 'miter' + + +@image_comparison(baseline_images=['annulus'], extensions=['png']) +def test_annulus(): + from matplotlib.patches import Annulus + + fig, ax = plt.subplots() + cir = Annulus((0.5, 0.5), 0.2, 0.05, fc='g') # circular annulus + ell = Annulus((0.5, 0.5), (0.5, 0.3), 0.1, 45, # elliptical + fc='m', ec='b', alpha=0.5, hatch='xxx') + ax.add_patch(cir) + ax.add_patch(ell) + ax.set_aspect('equal') From 7bc465ae48e4b720fb0d0b8e8a0968ad5967b09a Mon Sep 17 00:00:00 2001 From: apodemus Date: Tue, 9 Jan 2018 23:11:25 +0200 Subject: [PATCH 07/18] tweaks --- lib/matplotlib/patches.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 5e9887abb4a5..e67923a4d8a2 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1560,9 +1560,9 @@ class Annulus(Patch): def __str__(self): if self.a == self.b: - r = str(self.a) + r = self.a else: - r = '(%s, %s)' % (self.a, self.b) + r = (self.a, self.b) return "Annulus(xy=(%s, %s), r=%s, width=%s, angle=%s)" % \ (self.center[0], self.center[1], r, self.width, self.angle) @@ -1576,23 +1576,24 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): r : scalar or 1D array_like The radius, or semi-major axes - If float: radius of the outer circle - - If array_like of size 2: semi-major and -minor axes of outer ellipse + - If array_like of size 2: semi-major and -minor axes of outer + ellipse width : float - width of the annulus + width of the annulus angle: float, optional - rotation in degrees (anti-clockwise). Ignored for circular annuli (`r` is a scalar) - + rotation in degrees (anti-clockwise). Ignored for circular annuli + (`r` is a scalar) Valid kwargs are: %(Patch)s """ Patch.__init__(self, **kwargs) - if np.size(r) == 2: + if np.shape(r) == (2,): self.a, self.b = r - elif np.size(r) == 1: + elif np.shape(r) == (): self.a = self.b = float(r) else: raise ValueError( From 83047be99693e177963184f864307dd3652d7b7e Mon Sep 17 00:00:00 2001 From: astromancer Date: Wed, 3 Mar 2021 18:23:59 +0200 Subject: [PATCH 08/18] update docstring --- lib/matplotlib/patches.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index e67923a4d8a2..bf0084a0c1af 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1570,24 +1570,22 @@ def __str__(self): @docstring.dedent_interpd def __init__(self, xy, r, width, angle=0.0, **kwargs): """ - xy : array_like - center of annulus - + xy : (float, float) + xy coordinates of annulus centre r : scalar or 1D array_like The radius, or semi-major axes - If float: radius of the outer circle - If array_like of size 2: semi-major and -minor axes of outer ellipse - width : float - width of the annulus - + Width of the annulus angle: float, optional - rotation in degrees (anti-clockwise). Ignored for circular annuli - (`r` is a scalar) + Rotation angle in degrees (anti-clockwise). Ignored for circular + annuli (ie. if `r` is a scalar). Valid kwargs are: - %(Patch)s + + %(Patch_kwdoc)s """ Patch.__init__(self, **kwargs) From 32a5daf1fa158bd1f2f7e9c31c56a57cf81a3692 Mon Sep 17 00:00:00 2001 From: astromancer Date: Wed, 3 Mar 2021 18:32:08 +0200 Subject: [PATCH 09/18] add whats new --- doc/users/next_whats_new/annulus.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/users/next_whats_new/annulus.rst b/doc/users/next_whats_new/annulus.rst index 03e0d934ea7a..19c874ed33ea 100644 --- a/doc/users/next_whats_new/annulus.rst +++ b/doc/users/next_whats_new/annulus.rst @@ -2,3 +2,16 @@ Add ``Annulus`` patch --------------------- A new class for drawing elliptical annuli. + +.. plot:: + + import matplotlib.pyplot as plt + from matplotlib.patches import Annulus + + fig, ax = plt.subplots() + cir = Annulus((0.5, 0.5), 0.2, 0.05, fc='g') # circular annulus + ell = Annulus((0.5, 0.5), (0.5, 0.3), 0.1, 45, # elliptical + fc='m', ec='b', alpha=0.5, hatch='xxx') + ax.add_patch(cir) + ax.add_patch(ell) + ax.set_aspect('equal') \ No newline at end of file From 9f12372b3982f30e742d4ae98d099ab125d2d75f Mon Sep 17 00:00:00 2001 From: astromancer Date: Wed, 3 Mar 2021 18:46:59 +0200 Subject: [PATCH 10/18] cleanup test --- lib/matplotlib/tests/test_patches.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/tests/test_patches.py b/lib/matplotlib/tests/test_patches.py index 46160f693278..b08da0c58cd7 100644 --- a/lib/matplotlib/tests/test_patches.py +++ b/lib/matplotlib/tests/test_patches.py @@ -5,7 +5,8 @@ from numpy.testing import assert_almost_equal, assert_array_equal import pytest -from matplotlib.patches import Patch, Polygon, Rectangle, FancyArrowPatch +from matplotlib.patches import (Annulus, Patch, Polygon, Rectangle, + FancyArrowPatch) from matplotlib.testing.decorators import image_comparison, check_figures_equal from matplotlib.transforms import Bbox import matplotlib.pyplot as plt @@ -582,6 +583,18 @@ def test_rotated_arcs(): ax.set_aspect("equal") +@image_comparison(baseline_images=['annulus'], extensions=['png']) +def test_annulus(): + + fig, ax = plt.subplots() + cir = Annulus((0.5, 0.5), 0.2, 0.05, fc='g') # circular annulus + ell = Annulus((0.5, 0.5), (0.5, 0.3), 0.1, 45, # elliptical + fc='m', ec='b', alpha=0.5, hatch='xxx') + ax.add_patch(cir) + ax.add_patch(ell) + ax.set_aspect('equal') + + def test_degenerate_polygon(): point = [0, 0] correct_extents = Bbox([point, point]).extents @@ -628,14 +641,4 @@ def test_default_joinstyle(): assert patch.get_joinstyle() == 'miter' -@image_comparison(baseline_images=['annulus'], extensions=['png']) -def test_annulus(): - from matplotlib.patches import Annulus - fig, ax = plt.subplots() - cir = Annulus((0.5, 0.5), 0.2, 0.05, fc='g') # circular annulus - ell = Annulus((0.5, 0.5), (0.5, 0.3), 0.1, 45, # elliptical - fc='m', ec='b', alpha=0.5, hatch='xxx') - ax.add_patch(cir) - ax.add_patch(ell) - ax.set_aspect('equal') From 05cd23afaf15a5e5451d529edec9a0011e13c4c7 Mon Sep 17 00:00:00 2001 From: astromancer Date: Wed, 3 Mar 2021 19:53:35 +0200 Subject: [PATCH 11/18] flake8 --- lib/matplotlib/patches.py | 5 ++--- lib/matplotlib/tests/test_patches.py | 5 +---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index bf0084a0c1af..d44d4650d6eb 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1552,7 +1552,6 @@ def get_angle(self): angle = property(get_angle, set_angle) - class Annulus(Patch): """ An elliptical annulus. @@ -1580,11 +1579,11 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): width : float Width of the annulus angle: float, optional - Rotation angle in degrees (anti-clockwise). Ignored for circular + Rotation angle in degrees (anti-clockwise). Ignored for circular annuli (ie. if `r` is a scalar). Valid kwargs are: - + %(Patch_kwdoc)s """ Patch.__init__(self, **kwargs) diff --git a/lib/matplotlib/tests/test_patches.py b/lib/matplotlib/tests/test_patches.py index b08da0c58cd7..80e2e807eabb 100644 --- a/lib/matplotlib/tests/test_patches.py +++ b/lib/matplotlib/tests/test_patches.py @@ -5,7 +5,7 @@ from numpy.testing import assert_almost_equal, assert_array_equal import pytest -from matplotlib.patches import (Annulus, Patch, Polygon, Rectangle, +from matplotlib.patches import (Annulus, Patch, Polygon, Rectangle, FancyArrowPatch) from matplotlib.testing.decorators import image_comparison, check_figures_equal from matplotlib.transforms import Bbox @@ -639,6 +639,3 @@ def test_default_capstyle(): def test_default_joinstyle(): patch = Patch() assert patch.get_joinstyle() == 'miter' - - - From a5cf0c5599fdc81356713fb645a078c4bda805fc Mon Sep 17 00:00:00 2001 From: astromancer Date: Wed, 10 Mar 2021 21:33:30 +0200 Subject: [PATCH 12/18] simplify hstack --- lib/matplotlib/patches.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index d44d4650d6eb..2d2d670cbf73 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1627,9 +1627,9 @@ def _recompute_path(self): v1 = self._transform_verts(arc.vertices, a, b) v2 = self._transform_verts(arc.vertices[::-1], a - w, b - w) v = np.vstack([v1, v2, v1[0, :], (0, 0)]) - c = np.hstack([arc.codes, arc.codes, Path.MOVETO, Path.CLOSEPOLY]) - c[len(arc.codes)] = Path.MOVETO - + c = np.hstack([arc.codes, Path.MOVETO, + arc.codes[1:], Path.MOVETO, + Path.CLOSEPOLY]) self._path = Path(v, c) def get_path(self): From d2fc81ab10d4c15043a1721c4f8e98299a57858a Mon Sep 17 00:00:00 2001 From: Hannes Breytenbach Date: Fri, 12 Mar 2021 09:52:57 +0200 Subject: [PATCH 13/18] Apply suggestions from code review Co-authored-by: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> --- lib/matplotlib/patches.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 2d2d670cbf73..60720dd00594 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1570,23 +1570,23 @@ def __str__(self): def __init__(self, xy, r, width, angle=0.0, **kwargs): """ xy : (float, float) - xy coordinates of annulus centre - r : scalar or 1D array_like + xy coordinates of annulus centre. + r : float or (float, float) The radius, or semi-major axes - If float: radius of the outer circle - - If array_like of size 2: semi-major and -minor axes of outer + - If two floats: semi-major and -minor axes of outer ellipse width : float - Width of the annulus - angle: float, optional + Width of the annulus. + angle: float, default=0 Rotation angle in degrees (anti-clockwise). Ignored for circular - annuli (ie. if `r` is a scalar). + annuli (ie. if *r* is a scalar). Valid kwargs are: %(Patch_kwdoc)s """ - Patch.__init__(self, **kwargs) + super().__init__(**kwargs) if np.shape(r) == (2,): self.a, self.b = r @@ -1594,11 +1594,11 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): self.a = self.b = float(r) else: raise ValueError( - 'r parameter should be either float, or array_like of size 2') + "Parameter 'r' must be one or two floats") if min(self.a, self.b) <= width: raise ValueError( - 'Width of annulus should be smaller than semi-minor axis') + 'Width of annulus must be smaller than semi-minor axis') self.center = xy self.width = width From 23bd2da5beb45641a0d2146d8d5b2a009f047098 Mon Sep 17 00:00:00 2001 From: astromancer Date: Sun, 14 Mar 2021 09:53:44 +0200 Subject: [PATCH 14/18] attr setters/getters --- lib/matplotlib/patches.py | 126 +++++++++++++++++++++++++++++++------- 1 file changed, 103 insertions(+), 23 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 60720dd00594..978981b6bf43 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1557,15 +1557,6 @@ class Annulus(Patch): An elliptical annulus. """ - def __str__(self): - if self.a == self.b: - r = self.a - else: - r = (self.a, self.b) - - return "Annulus(xy=(%s, %s), r=%s, width=%s, angle=%s)" % \ - (self.center[0], self.center[1], r, self.width, self.angle) - @docstring.dedent_interpd def __init__(self, xy, r, width, angle=0.0, **kwargs): """ @@ -1577,7 +1568,7 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): - If two floats: semi-major and -minor axes of outer ellipse width : float - Width of the annulus. + Width (thickness) of the annulus ring. angle: float, default=0 Rotation angle in degrees (anti-clockwise). Ignored for circular annuli (ie. if *r* is a scalar). @@ -1593,29 +1584,118 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): elif np.shape(r) == (): self.a = self.b = float(r) else: - raise ValueError( - "Parameter 'r' must be one or two floats") + raise ValueError("Parameter 'r' must be one or two floats") if min(self.a, self.b) <= width: raise ValueError( 'Width of annulus must be smaller than semi-minor axis') - self.center = xy - self.width = width + self._center = xy + self._width = width self.angle = angle self._path = None + + def __str__(self): + if self.a == self.b: + r = self.a + else: + r = (self.a, self.b) + + return "Annulus(xy=(%s, %s), r=%s, width=%s, angle=%s)" % \ + (*self.center, r, self.width, self.angle) + + def set_center(self, xy): + """ + Set the center of the annulus. + + Parameters + ---------- + xy : (float, float) + """ + self._center = xy + self.stale = True + + def get_center(self): + """Return the center of the annulus.""" + return self._center + + center = property(get_center, set_center) + + def set_width(self, width): + """ + Set the width (thickness) of the annulus ring. + Parameters + ---------- + width : float + """ + self._width = width + self.stale = True + + def get_width(self): + """ + Return the width (thickness) of the annulus ring. + """ + return self._width + + width = property(get_width, set_width) + + def set_angle(self, angle): + """ + Set the tilt angle of the annulus. + + Parameters + ---------- + angle : float + """ + self._angle = angle + self.stale = True + + def get_angle(self): + """Return the angle of the annulus.""" + return self._angle + + angle = property(get_angle, set_angle) + + def set_semimajor(self, a): + """ + Set the semi-major axis *a* of the annulus. + + Parameters + ---------- + a : float + """ + self.a = float(a) + self.stale = True + + def set_semiminor(self, b): + """ + Set the semi-minor axis *b* of the annulus. + + Parameters + ---------- + b : float + """ + self.b = float(b) + self.stale = True + + def set_radii(self, radii): + """ + Set the both the semi-major (*a*) and -minor radii (*b*) of the annulus. + + Parameters + ---------- + radii : (float, float) + """ + self.a, self.b = radii + self.stale = True + def _transform_verts(self, verts, a, b): - center = (self.convert_xunits(self.center[0]), - self.convert_yunits(self.center[1])) - a = self.convert_xunits(a) - b = self.convert_yunits(b) - tr = transforms.Affine2D() \ - .scale(a, b) \ + return transforms.Affine2D() \ + .scale(*self._convert_xy_units((a, b))) \ .rotate_deg(self.angle) \ - .translate(*center) - - return tr.transform(verts) + .translate(*self._convert_xy_units(self.center)) \ + .transform(verts) def _recompute_path(self): # circular arc From f0392f603009134a42d0d5e5b129b32fd0eee8ec Mon Sep 17 00:00:00 2001 From: astromancer Date: Sun, 14 Mar 2021 10:04:48 +0200 Subject: [PATCH 15/18] flake8 --- lib/matplotlib/patches.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 978981b6bf43..955411a69eb2 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1594,7 +1594,7 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): self._width = width self.angle = angle self._path = None - + def __str__(self): if self.a == self.b: r = self.a @@ -1602,8 +1602,8 @@ def __str__(self): r = (self.a, self.b) return "Annulus(xy=(%s, %s), r=%s, width=%s, angle=%s)" % \ - (*self.center, r, self.width, self.angle) - + (*self.center, r, self.width, self.angle) + def set_center(self, xy): """ Set the center of the annulus. @@ -1620,7 +1620,7 @@ def get_center(self): return self._center center = property(get_center, set_center) - + def set_width(self, width): """ Set the width (thickness) of the annulus ring. @@ -1639,7 +1639,7 @@ def get_width(self): return self._width width = property(get_width, set_width) - + def set_angle(self, angle): """ Set the tilt angle of the annulus. @@ -1656,42 +1656,43 @@ def get_angle(self): return self._angle angle = property(get_angle, set_angle) - + def set_semimajor(self, a): """ Set the semi-major axis *a* of the annulus. - + Parameters ---------- a : float """ self.a = float(a) self.stale = True - + def set_semiminor(self, b): """ Set the semi-minor axis *b* of the annulus. - + Parameters ---------- b : float """ self.b = float(b) self.stale = True - + def set_radii(self, radii): """ - Set the both the semi-major (*a*) and -minor radii (*b*) of the annulus. - + Set the both the semi-major (*a*) and -minor radii (*b*) of the + annulus. + Parameters ---------- radii : (float, float) """ self.a, self.b = radii self.stale = True - + def _transform_verts(self, verts, a, b): - return transforms.Affine2D() \ + return transforms.Affine2D() \ .scale(*self._convert_xy_units((a, b))) \ .rotate_deg(self.angle) \ .translate(*self._convert_xy_units(self.center)) \ From 0882ed870010eb470b663efa49432abc9b92cf6c Mon Sep 17 00:00:00 2001 From: astromancer Date: Sat, 27 Mar 2021 16:01:55 +0200 Subject: [PATCH 16/18] update setters --- lib/matplotlib/patches.py | 44 +++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 955411a69eb2..fb99c1ab6dc4 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1579,19 +1579,9 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): """ super().__init__(**kwargs) - if np.shape(r) == (2,): - self.a, self.b = r - elif np.shape(r) == (): - self.a = self.b = float(r) - else: - raise ValueError("Parameter 'r' must be one or two floats") - - if min(self.a, self.b) <= width: - raise ValueError( - 'Width of annulus must be smaller than semi-minor axis') - - self._center = xy - self._width = width + self.set_radii(r) + self.center = xy + self.width = width self.angle = angle self._path = None @@ -1613,6 +1603,7 @@ def set_center(self, xy): xy : (float, float) """ self._center = xy + self._path = None self.stale = True def get_center(self): @@ -1629,7 +1620,12 @@ def set_width(self, width): ---------- width : float """ + if min(self.a, self.b) <= width: + raise ValueError( + 'Width of annulus must be smaller than semi-minor axis') + self._width = width + self._path = None self.stale = True def get_width(self): @@ -1649,6 +1645,7 @@ def set_angle(self, angle): angle : float """ self._angle = angle + self._path = None self.stale = True def get_angle(self): @@ -1666,6 +1663,7 @@ def set_semimajor(self, a): a : float """ self.a = float(a) + self._path = None self.stale = True def set_semiminor(self, b): @@ -1677,20 +1675,34 @@ def set_semiminor(self, b): b : float """ self.b = float(b) + self._path = None self.stale = True - def set_radii(self, radii): + def set_radii(self, r): """ Set the both the semi-major (*a*) and -minor radii (*b*) of the annulus. Parameters ---------- - radii : (float, float) + r : (float, float) """ - self.a, self.b = radii + if np.shape(r) == (2,): + self.a, self.b = r + elif np.shape(r) == (): + self.a = self.b = float(r) + else: + raise ValueError("Parameter 'r' must be one or two floats.") + + self._path = None self.stale = True + def get_radii(self): + return self.a, self.b + + # alias + radii = property(get_radii, set_radii) + def _transform_verts(self, verts, a, b): return transforms.Affine2D() \ .scale(*self._convert_xy_units((a, b))) \ From 0ba1cbaf3189d4cab46a72f17453c7952bf3c85b Mon Sep 17 00:00:00 2001 From: astromancer Date: Sat, 27 Mar 2021 16:03:39 +0200 Subject: [PATCH 17/18] test setters and string repr --- lib/matplotlib/tests/test_patches.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/matplotlib/tests/test_patches.py b/lib/matplotlib/tests/test_patches.py index 80e2e807eabb..079dabaf5eb1 100644 --- a/lib/matplotlib/tests/test_patches.py +++ b/lib/matplotlib/tests/test_patches.py @@ -334,6 +334,10 @@ def test_patch_str(): expected = 'Arc(xy=(1, 2), width=3, height=4, angle=5, theta1=6, theta2=7)' assert str(p) == expected + p = mpatches.Annulus(xy=(1, 2), r=(3, 4), width=1, angle=2) + expected = "Annulus(xy=(1, 2), r=(3, 4), width=1, angle=2)" + assert str(p) == expected + p = mpatches.RegularPolygon((1, 2), 20, radius=5) assert str(p) == "RegularPolygon((1, 2), 20, radius=5, orientation=0)" @@ -595,6 +599,27 @@ def test_annulus(): ax.set_aspect('equal') +@image_comparison(baseline_images=['annulus'], extensions=['png']) +def test_annulus_setters(): + + fig, ax = plt.subplots() + cir = Annulus((0., 0.), 0.2, 0.01, fc='g') # circular annulus + ell = Annulus((0., 0.), (1, 2), 0.1, 0, # elliptical + fc='m', ec='b', alpha=0.5, hatch='xxx') + ax.add_patch(cir) + ax.add_patch(ell) + ax.set_aspect('equal') + + cir.center = (0.5, 0.5) + cir.radii = 0.2 + cir.width = 0.05 + + ell.center = (0.5, 0.5) + ell.radii = (0.5, 0.3) + ell.width = 0.1 + ell.angle = 45 + + def test_degenerate_polygon(): point = [0, 0] correct_extents = Bbox([point, point]).extents From b21d4ee9154ee00226bd835a973bdb0c8a14b875 Mon Sep 17 00:00:00 2001 From: astromancer Date: Thu, 8 Apr 2021 13:10:15 +0200 Subject: [PATCH 18/18] update docs --- lib/matplotlib/patches.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index fb99c1ab6dc4..c46e5b21ecb7 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1563,15 +1563,17 @@ def __init__(self, xy, r, width, angle=0.0, **kwargs): xy : (float, float) xy coordinates of annulus centre. r : float or (float, float) - The radius, or semi-major axes - - If float: radius of the outer circle - - If two floats: semi-major and -minor axes of outer - ellipse + The radius, or semi-axes. + - If float: radius of the outer circle. + - If two floats: semi-major and -minor axes of outer ellipse. width : float - Width (thickness) of the annulus ring. - angle: float, default=0 - Rotation angle in degrees (anti-clockwise). Ignored for circular - annuli (ie. if *r* is a scalar). + Width (thickness) of the annular ring. The width is measured inward + from the outer ellipse so that for the inner ellipse the semi-axes + are given by `r - width`. `width` must be less than or equal to the + semi-minor axis. + angle : float, default=0 + Rotation angle in degrees (anti-clockwise from the positive + x-axis). Ignored for circular annuli (ie. if *r* is a scalar). Valid kwargs are: @@ -1614,7 +1616,8 @@ def get_center(self): def set_width(self, width): """ - Set the width (thickness) of the annulus ring. + Set the width (thickness) of the annulus ring. The width is measured + inwards from the outer ellipse. Parameters ---------- @@ -1622,7 +1625,7 @@ def set_width(self, width): """ if min(self.a, self.b) <= width: raise ValueError( - 'Width of annulus must be smaller than semi-minor axis') + 'Width of annulus must be less than or equal semi-minor axis') self._width = width self._path = None @@ -1700,7 +1703,6 @@ def set_radii(self, r): def get_radii(self): return self.a, self.b - # alias radii = property(get_radii, set_radii) def _transform_verts(self, verts, a, b):