127127.. |m36| image:: /_static/markers/m36.png
128128.. |m37| image:: /_static/markers/m37.png
129129"""
130+ import copy
130131
131132from collections .abc import Sized
132133import 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