Skip to content

Commit 34b1034

Browse files
committed
Add user supplied transforms and join/cap styles
Improvement was done in instantiating new instance utilizing deep copy should preserve immutability of MarkerStyle members (e.g. Path, or Transform).
1 parent a89d7f0 commit 34b1034

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

lib/matplotlib/markers.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
.. |m36| image:: /_static/markers/m36.png
128128
.. |m37| image:: /_static/markers/m37.png
129129
"""
130+
import copy
130131

131132
from collections.abc import Sized
132133
import inspect
@@ -221,7 +222,8 @@ class MarkerStyle:
221222

222223
_unset = object() # For deprecation of MarkerStyle(<noargs>).
223224

224-
def __init__(self, marker=_unset, fillstyle=None):
225+
def __init__(self, marker=_unset, fillstyle=None,
226+
transform=None, capstyle=None, joinstyle=None):
225227
"""
226228
Parameters
227229
----------
@@ -236,6 +238,9 @@ def __init__(self, marker=_unset, fillstyle=None):
236238
One of 'full', 'left', 'right', 'bottom', 'top', 'none'.
237239
"""
238240
self._marker_function = None
241+
self._user_transform = transform
242+
self._user_capstyle = capstyle
243+
self._user_joinstyle = joinstyle
239244
self._set_fillstyle(fillstyle)
240245
# Remove _unset and signature rewriting after deprecation elapses.
241246
if marker is self._unset:
@@ -265,7 +270,7 @@ def _recache(self):
265270
self._alt_transform = None
266271
self._snap_threshold = None
267272
self._joinstyle = JoinStyle.round
268-
self._capstyle = CapStyle.butt
273+
self._capstyle = self._user_capstyle or CapStyle.butt
269274
# Initial guess: Assume the marker is filled unless the fillstyle is
270275
# set to 'none'. The marker function will override this for unfilled
271276
# markers.
@@ -342,7 +347,8 @@ def _set_marker(self, marker):
342347
self._marker_function = getattr(
343348
self, '_set_' + self.markers[marker])
344349
elif isinstance(marker, MarkerStyle):
345-
self.__dict__.update(marker.__dict__)
350+
self.__dict__ = copy.deepcopy(marker.__dict__)
351+
346352
else:
347353
try:
348354
Path(marker)
@@ -369,7 +375,10 @@ def get_transform(self):
369375
Return the transform to be applied to the `.Path` from
370376
`MarkerStyle.get_path()`.
371377
"""
372-
return self._transform.frozen()
378+
if self._user_transform is not None:
379+
return (self._transform + self._user_transform).frozen()
380+
else:
381+
return self._transform.frozen()
373382

374383
def get_alt_path(self):
375384
"""
@@ -385,7 +394,10 @@ def get_alt_transform(self):
385394
Return the transform to be applied to the `.Path` from
386395
`MarkerStyle.get_alt_path()`.
387396
"""
388-
return self._alt_transform.frozen()
397+
if self._user_transform is not None:
398+
return (self._alt_transform + self._user_transform).frozen()
399+
else:
400+
return self._alt_transform.frozen()
389401

390402
def get_snap_threshold(self):
391403
return self._snap_threshold
@@ -413,14 +425,14 @@ def _set_tuple_marker(self):
413425
symstyle = marker[1]
414426
if symstyle == 0:
415427
self._path = Path.unit_regular_polygon(numsides)
416-
self._joinstyle = JoinStyle.miter
428+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
417429
elif symstyle == 1:
418430
self._path = Path.unit_regular_star(numsides)
419-
self._joinstyle = JoinStyle.bevel
431+
self._joinstyle = self._user_joinstyle or JoinStyle.bevel
420432
elif symstyle == 2:
421433
self._path = Path.unit_regular_asterisk(numsides)
422434
self._filled = False
423-
self._joinstyle = JoinStyle.bevel
435+
self._joinstyle = self._user_joinstyle or JoinStyle.bevel
424436
else:
425437
raise ValueError(f"Unexpected tuple marker: {marker}")
426438
self._transform = Affine2D().scale(0.5).rotate_deg(rotation)
@@ -521,7 +533,7 @@ def _set_triangle(self, rot, skip):
521533

522534
self._alt_transform = self._transform
523535

524-
self._joinstyle = JoinStyle.miter
536+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
525537

526538
def _set_triangle_up(self):
527539
return self._set_triangle(0.0, 0)
@@ -551,7 +563,7 @@ def _set_square(self):
551563
self._transform.rotate_deg(rotate)
552564
self._alt_transform = self._transform
553565

554-
self._joinstyle = JoinStyle.miter
566+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
555567

556568
def _set_diamond(self):
557569
self._transform = Affine2D().translate(-0.5, -0.5).rotate_deg(45)
@@ -565,7 +577,7 @@ def _set_diamond(self):
565577
rotate = {'right': 0, 'top': 90, 'left': 180, 'bottom': 270}[fs]
566578
self._transform.rotate_deg(rotate)
567579
self._alt_transform = self._transform
568-
self._joinstyle = JoinStyle.miter
580+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
569581

570582
def _set_thin_diamond(self):
571583
self._set_diamond()
@@ -592,7 +604,7 @@ def _set_pentagon(self):
592604
}[self.get_fillstyle()]
593605
self._alt_transform = self._transform
594606

595-
self._joinstyle = JoinStyle.miter
607+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
596608

597609
def _set_star(self):
598610
self._transform = Affine2D().scale(0.5)
@@ -614,7 +626,7 @@ def _set_star(self):
614626
}[self.get_fillstyle()]
615627
self._alt_transform = self._transform
616628

617-
self._joinstyle = JoinStyle.bevel
629+
self._joinstyle = self._user_joinstyle or JoinStyle.bevel
618630

619631
def _set_hexagon1(self):
620632
self._transform = Affine2D().scale(0.5)
@@ -638,7 +650,7 @@ def _set_hexagon1(self):
638650
}[self.get_fillstyle()]
639651
self._alt_transform = self._transform
640652

641-
self._joinstyle = JoinStyle.miter
653+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
642654

643655
def _set_hexagon2(self):
644656
self._transform = Affine2D().scale(0.5).rotate_deg(30)
@@ -664,7 +676,7 @@ def _set_hexagon2(self):
664676
}[self.get_fillstyle()]
665677
self._alt_transform = self._transform
666678

667-
self._joinstyle = JoinStyle.miter
679+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
668680

669681
def _set_octagon(self):
670682
self._transform = Affine2D().scale(0.5)
@@ -685,7 +697,7 @@ def _set_octagon(self):
685697
{'left': 0, 'bottom': 90, 'right': 180, 'top': 270}[fs])
686698
self._alt_transform = self._transform.frozen().rotate_deg(180.0)
687699

688-
self._joinstyle = JoinStyle.miter
700+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
689701

690702
_line_marker_path = Path([[0.0, -1.0], [0.0, 1.0]])
691703

@@ -759,7 +771,7 @@ def _set_caretdown(self):
759771
self._snap_threshold = 3.0
760772
self._filled = False
761773
self._path = self._caret_path
762-
self._joinstyle = JoinStyle.miter
774+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
763775

764776
def _set_caretup(self):
765777
self._set_caretdown()
@@ -825,7 +837,7 @@ def _set_x(self):
825837
def _set_plus_filled(self):
826838
self._transform = Affine2D()
827839
self._snap_threshold = 5.0
828-
self._joinstyle = JoinStyle.miter
840+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
829841
if not self._half_fill():
830842
self._path = self._plus_filled_path
831843
else:
@@ -849,7 +861,7 @@ def _set_plus_filled(self):
849861
def _set_x_filled(self):
850862
self._transform = Affine2D()
851863
self._snap_threshold = 5.0
852-
self._joinstyle = JoinStyle.miter
864+
self._joinstyle = self._user_joinstyle or JoinStyle.miter
853865
if not self._half_fill():
854866
self._path = self._x_filled_path
855867
else:

0 commit comments

Comments
 (0)