Skip to content

Commit 9ef7f6b

Browse files
committed
Add marker.transformed + test
1 parent 08b7871 commit 9ef7f6b

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

lib/matplotlib/markers.py

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ def __init__(self, marker=_unset, fillstyle=None,
236236
237237
fillstyle : str, default: :rc:`markers.fillstyle`
238238
One of 'full', 'left', 'right', 'bottom', 'top', 'none'.
239-
239+
240240
transform : Affine2D, default: None
241241
User supplied transformation that will be combined with the
242242
native transformation of selected marker.
@@ -319,10 +319,10 @@ def _set_fillstyle(self, fillstyle):
319319
self._recache()
320320

321321
def get_joinstyle(self):
322-
return self._joinstyle
322+
return self._user_joinstyle or self._joinstyle
323323

324324
def get_capstyle(self):
325-
return self._capstyle
325+
return self._user_capstyle or self._capstyle
326326

327327
def get_marker(self):
328328
return self._marker
@@ -414,6 +414,51 @@ def get_alt_transform(self):
414414
def get_snap_threshold(self):
415415
return self._snap_threshold
416416

417+
def get_user_transform(self):
418+
"""Return user supplied part of marker transform."""
419+
if self._user_transform is not None:
420+
return self._user_transform.frozen()
421+
422+
def transformed(self, transform:Affine2D):
423+
"""
424+
Return new marker with combined transformation.
425+
426+
Parameters
427+
----------
428+
transform : Affine2D, default: None
429+
- transform will be combined with current user supplied transform.
430+
"""
431+
new_marker = MarkerStyle(self)
432+
if new_marker._user_transform is not None:
433+
new_marker._user_transform += transform
434+
else:
435+
new_marker._user_transform = transform
436+
return new_marker
437+
438+
def rotated(self, deg=None, rad=None):
439+
"""
440+
Return new marker rotated by specified angle.
441+
442+
Parameters
443+
----------
444+
deg : float, default: None
445+
446+
rad : float, default: None
447+
"""
448+
if not ((deg is None) ^ (rad is None)):
449+
raise Exception("Only one of deg or rad shall be used.")
450+
451+
_transform = self._user_transform or Affine2D()
452+
453+
if deg is not None:
454+
_transform = _transform.rotate_deg(deg)
455+
456+
if rad is not None:
457+
_transform = _transform.rotate(rad)
458+
459+
new_marker = MarkerStyle(self)
460+
new_marker._user_transform = _transform
461+
417462
def _set_nothing(self):
418463
self._filled = False
419464

lib/matplotlib/tests/test_marker.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from matplotlib._api.deprecation import MatplotlibDeprecationWarning
55
from matplotlib.path import Path
66
from matplotlib.testing.decorators import check_figures_equal
7+
from matplotlib.transforms import Affine2D
78

89
import pytest
910

@@ -204,3 +205,13 @@ def test_marker_clipping(fig_ref, fig_test):
204205
ax_test.set(xlim=(-0.5, ncol), ylim=(-0.5, 2 * nrow))
205206
ax_ref.axis('off')
206207
ax_test.axis('off')
208+
209+
@pytest.mark.parametrize("marker,transform,expected", [
210+
(markers.MarkerStyle("o"), Affine2D().translate(1,1), Affine2D().translate(1,1)),
211+
(markers.MarkerStyle("o", transform=Affine2D().translate(1,1)), Affine2D().translate(1,1), Affine2D().translate(2,2)),
212+
])
213+
def test_marker_transformed(marker, transform, expected):
214+
new_marker = marker.transformed(transform)
215+
assert new_marker is not marker
216+
assert new_marker.get_user_transform() == expected
217+
assert marker.get_user_transform() is not new_marker.get_user_transform()

0 commit comments

Comments
 (0)