diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 5e5c19c9f69f..6c9c92e86af3 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -420,6 +420,7 @@ def __init__(self, xdata, ydata, *, self._xy = None self._path = None self._transformed_path = None + self._transform_when_path_transformed = None self._subslice = False self._x_filled = None # used in subslicing; only x is needed @@ -721,6 +722,7 @@ def _transform_path(self, subslice=None): _interpolation_steps=self._path._interpolation_steps) else: _path = self._path + self._transform_when_path_transformed = self.get_transform().frozen() self._transformed_path = TransformedPath(_path, self.get_transform()) def _get_transformed_path(self): @@ -742,7 +744,7 @@ def draw(self, renderer): if not self.get_visible(): return - if self._invalidy or self._invalidx: + if self._invalidy or self._invalidx or self.get_transform() != self._transform_when_path_transformed: self.recache() self.ind_offset = 0 # Needed for contains() method. if self._subslice and self.axes: diff --git a/lib/matplotlib/tests/test_polar.py b/lib/matplotlib/tests/test_polar.py index ad1540a36621..713002804c9f 100644 --- a/lib/matplotlib/tests/test_polar.py +++ b/lib/matplotlib/tests/test_polar.py @@ -454,3 +454,27 @@ 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°'] + + +@check_figures_equal(extensions=["png"]) +def test_polar_lim_draw(fig_test, fig_ref): + """ + Check that lines on polar axes are correctly transformed after + a draw and an axes limit change. + + """ + # A quarter arc at r=5 + theta = np.linspace(0, np.pi/2, 90) + r = np.full(90, 5) + + ax_ref = fig_ref.add_subplot(projection='polar') + ax_ref.set_ylim(0, 10) + ax_ref.plot(theta, r) + + ax_test = fig_test.add_subplot(projection='polar') + ax_test.set_ylim(4, 10) + + ax_test.plot(theta, r) + fig_test.canvas.draw() + + ax_test.set_ylim(0, 10)