From 4abf666099aa3db28d285523d77e75809195b2d8 Mon Sep 17 00:00:00 2001 From: Kyra Cho Date: Fri, 11 Oct 2024 02:41:09 +0000 Subject: [PATCH] Fix polar error bar cap orientation --- lib/matplotlib/axes/_axes.py | 6 ++-- .../test_polar/polar_errorbar.png | Bin 0 -> 68420 bytes lib/matplotlib/tests/test_polar.py | 18 ++++++++++++ lib/matplotlib/tests/test_transforms.py | 27 +++++++++++++++++- lib/matplotlib/transforms.py | 19 ++++++++++++ lib/matplotlib/transforms.pyi | 5 ++++ 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_polar/polar_errorbar.png diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index a16e19f90152..7c049faab799 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -37,6 +37,7 @@ _AxesBase, _TransformedBoundsLocator, _process_plot_format) from matplotlib.axes._secondary_axes import SecondaryAxis from matplotlib.container import BarContainer, ErrorbarContainer, StemContainer +from matplotlib.transforms import _ScaledRotation _log = logging.getLogger(__name__) @@ -3784,13 +3785,14 @@ def apply_mask(arrays, mask): caplines[dep_axis].append(mlines.Line2D( x_masked, y_masked, marker=marker, **eb_cap_style)) if self.name == 'polar': + trans_shift = self.transShift for axis in caplines: for l in caplines[axis]: # Rotate caps to be perpendicular to the error bars for theta, r in zip(l.get_xdata(), l.get_ydata()): - rotation = mtransforms.Affine2D().rotate(theta) + rotation = _ScaledRotation(theta=theta, trans_shift=trans_shift) if axis == 'y': - rotation.rotate(-np.pi / 2) + rotation += mtransforms.Affine2D().rotate(np.pi / 2) ms = mmarkers.MarkerStyle(marker=marker, transform=rotation) self.add_line(mlines.Line2D([theta], [r], marker=ms, diff --git a/lib/matplotlib/tests/baseline_images/test_polar/polar_errorbar.png b/lib/matplotlib/tests/baseline_images/test_polar/polar_errorbar.png new file mode 100644 index 0000000000000000000000000000000000000000..6b587a78ae101ecc52358b5fc5f656beae15bedc GIT binary patch literal 68420 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_polar.py b/lib/matplotlib/tests/test_polar.py index 0bb41a50b2d4..ee38c88a123f 100644 --- a/lib/matplotlib/tests/test_polar.py +++ b/lib/matplotlib/tests/test_polar.py @@ -481,3 +481,21 @@ def test_polar_neg_theta_lims(): ax.set_thetalim(-np.pi, np.pi) labels = [l.get_text() for l in ax.xaxis.get_ticklabels()] assert labels == ['-180°', '-135°', '-90°', '-45°', '0°', '45°', '90°', '135°'] + + +@pytest.mark.parametrize("order", ["before", "after"]) +@image_comparison(baseline_images=['polar_errorbar'], remove_text=True, + extensions=['png'], style='mpl20') +def test_polar_errorbar(order): + theta = np.arange(0, 2 * np.pi, np.pi / 8) + r = theta / np.pi / 2 + 0.5 + fig = plt.figure(figsize=(5, 5)) + ax = fig.add_subplot(projection='polar') + if order == "before": + ax.set_theta_zero_location("N") + ax.set_theta_direction(-1) + ax.errorbar(theta, r, xerr=0.1, yerr=0.1, capsize=7, fmt="o", c="seagreen") + else: + ax.errorbar(theta, r, xerr=0.1, yerr=0.1, capsize=7, fmt="o", c="seagreen") + ax.set_theta_zero_location("N") + ax.set_theta_direction(-1) diff --git a/lib/matplotlib/tests/test_transforms.py b/lib/matplotlib/tests/test_transforms.py index 64b312d09d34..96e78b6828f8 100644 --- a/lib/matplotlib/tests/test_transforms.py +++ b/lib/matplotlib/tests/test_transforms.py @@ -9,9 +9,10 @@ import matplotlib.pyplot as plt import matplotlib.patches as mpatches import matplotlib.transforms as mtransforms -from matplotlib.transforms import Affine2D, Bbox, TransformedBbox +from matplotlib.transforms import Affine2D, Bbox, TransformedBbox, _ScaledRotation from matplotlib.path import Path from matplotlib.testing.decorators import image_comparison, check_figures_equal +from unittest.mock import MagicMock class TestAffine2D: @@ -1104,3 +1105,27 @@ def test_interval_contains_open(): assert not mtransforms.interval_contains_open((0, 1), -1) assert not mtransforms.interval_contains_open((0, 1), 2) assert mtransforms.interval_contains_open((1, 0), 0.5) + + +def test_scaledrotation_initialization(): + """Test that the ScaledRotation object is initialized correctly.""" + theta = 1.0 # Arbitrary theta value for testing + trans_shift = MagicMock() # Mock the trans_shift transformation + scaled_rot = _ScaledRotation(theta, trans_shift) + assert scaled_rot._theta == theta + assert scaled_rot._trans_shift == trans_shift + assert scaled_rot._mtx is None + + +def test_scaledrotation_get_matrix_invalid(): + """Test get_matrix when the matrix is invalid and needs recalculation.""" + theta = np.pi / 2 + trans_shift = MagicMock(transform=MagicMock(return_value=[[theta, 0]])) + scaled_rot = _ScaledRotation(theta, trans_shift) + scaled_rot._invalid = True + matrix = scaled_rot.get_matrix() + trans_shift.transform.assert_called_once_with([[theta, 0]]) + expected_rotation = np.array([[0, -1], + [1, 0]]) + assert matrix is not None + assert_allclose(matrix[:2, :2], expected_rotation, atol=1e-15) diff --git a/lib/matplotlib/transforms.py b/lib/matplotlib/transforms.py index 15caff545e73..dbe6e85d367c 100644 --- a/lib/matplotlib/transforms.py +++ b/lib/matplotlib/transforms.py @@ -2685,6 +2685,25 @@ def get_matrix(self): return self._mtx +class _ScaledRotation(Affine2DBase): + """ + A transformation that applies rotation by *theta*, after transform by *trans_shift*. + """ + def __init__(self, theta, trans_shift): + super().__init__() + self._theta = theta + self._trans_shift = trans_shift + self._mtx = None + + def get_matrix(self): + if self._invalid: + transformed_coords = self._trans_shift.transform([[self._theta, 0]])[0] + adjusted_theta = transformed_coords[0] + rotation = Affine2D().rotate(adjusted_theta) + self._mtx = rotation.get_matrix() + return self._mtx + + class AffineDeltaTransform(Affine2DBase): r""" A transform wrapper for transforming displacements between pairs of points. diff --git a/lib/matplotlib/transforms.pyi b/lib/matplotlib/transforms.pyi index c87a965b1e4a..551487a11c60 100644 --- a/lib/matplotlib/transforms.pyi +++ b/lib/matplotlib/transforms.pyi @@ -334,3 +334,8 @@ def offset_copy( y: float = ..., units: Literal["inches", "points", "dots"] = ..., ) -> Transform: ... + + +class _ScaledRotation(Affine2DBase): + def __init__(self, theta: float, trans_shift: Transform) -> None: ... + def get_matrix(self) -> np.ndarray: ...