Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1663e9a

Browse files
Merge pull request matplotlib#30174 from timhoffm/fix-radialaxis
FIX: Ensure Locators on RadialAxis are always correctly wrapped
2 parents 30f4ece + b02ed41 commit 1663e9a

File tree

3 files changed

+47
-18
lines changed

3 files changed

+47
-18
lines changed

‎lib/matplotlib/projections/polar.py‎

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -679,20 +679,15 @@ def __init__(self, *args, **kwargs):
679679
super().__init__(*args, **kwargs)
680680
self.sticky_edges.y.append(0)
681681

682-
def _wrap_locator_formatter(self):
683-
self.set_major_locator(RadialLocator(self.get_major_locator(),
684-
self.axes))
685-
self.isDefault_majloc=True
682+
def set_major_locator(self, locator):
683+
ifnotisinstance(locator, RadialLocator):
684+
locator=RadialLocator(locator, self.axes)
685+
super().set_major_locator(locator)
686686

687687
def clear(self):
688688
# docstring inherited
689689
super().clear()
690690
self.set_ticks_position('none')
691-
self._wrap_locator_formatter()
692-
693-
def _set_scale(self, value, **kwargs):
694-
super()._set_scale(value, **kwargs)
695-
self._wrap_locator_formatter()
696691

697692

698693
def _is_full_circle_deg(thetamin, thetamax):
@@ -1248,19 +1243,11 @@ def set_rlabel_position(self, value):
12481243
"""
12491244
self._r_label_position.clear().translate(np.deg2rad(value), 0.0)
12501245

1251-
def set_yscale(self, *args, **kwargs):
1252-
super().set_yscale(*args, **kwargs)
1253-
self.yaxis.set_major_locator(
1254-
self.RadialLocator(self.yaxis.get_major_locator(), self))
1255-
12561246
def set_rscale(self, *args, **kwargs):
12571247
return Axes.set_yscale(self, *args, **kwargs)
12581248

12591249
def set_rticks(self, *args, **kwargs):
1260-
result = Axes.set_yticks(self, *args, **kwargs)
1261-
self.yaxis.set_major_locator(
1262-
self.RadialLocator(self.yaxis.get_major_locator(), self))
1263-
return result
1250+
return Axes.set_yticks(self, *args, **kwargs)
12641251

12651252
def set_thetagrids(self, angles, labels=None, fmt=None, **kwargs):
12661253
"""
-334 Bytes
Loading[フレーム]

‎lib/matplotlib/tests/test_polar.py‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import pytest
44

55
import matplotlib as mpl
6+
from matplotlib.projections.polar import RadialLocator
67
from matplotlib import pyplot as plt
78
from matplotlib.testing.decorators import image_comparison, check_figures_equal
9+
import matplotlib.ticker as mticker
810

911

1012
@image_comparison(['polar_axes.png'], style='default', tol=0.012)
@@ -546,3 +548,43 @@ def test_radial_limits_behavior():
546548
# negative data also autoscales to negative limits
547549
ax.plot([1, 2], [-1, -2])
548550
assert ax.get_ylim() == (-2, 2)
551+
552+
553+
def test_radial_locator_wrapping():
554+
# Check that the locator is always wrapped inside a RadialLocator
555+
# and that RaidialAxis.isDefault_majloc is set correctly.
556+
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
557+
assert ax.yaxis.isDefault_majloc
558+
assert isinstance(ax.yaxis.get_major_locator(), RadialLocator)
559+
560+
# set an explicit locator
561+
locator = mticker.MaxNLocator(3)
562+
ax.yaxis.set_major_locator(locator)
563+
assert not ax.yaxis.isDefault_majloc
564+
assert isinstance(ax.yaxis.get_major_locator(), RadialLocator)
565+
assert ax.yaxis.get_major_locator().base is locator
566+
567+
ax.clear() # reset to the default locator
568+
assert ax.yaxis.isDefault_majloc
569+
assert isinstance(ax.yaxis.get_major_locator(), RadialLocator)
570+
571+
ax.set_rticks([0, 1, 2, 3]) # implicitly sets a FixedLocator
572+
assert not ax.yaxis.isDefault_majloc # because of the fixed ticks
573+
assert isinstance(ax.yaxis.get_major_locator(), RadialLocator)
574+
assert isinstance(ax.yaxis.get_major_locator().base, mticker.FixedLocator)
575+
576+
ax.clear()
577+
578+
ax.set_rgrids([0, 1, 2, 3]) # implicitly sets a FixedLocator
579+
assert not ax.yaxis.isDefault_majloc # because of the fixed ticks
580+
assert isinstance(ax.yaxis.get_major_locator(), RadialLocator)
581+
assert isinstance(ax.yaxis.get_major_locator().base, mticker.FixedLocator)
582+
583+
ax.clear()
584+
585+
ax.set_yscale("log") # implicitly sets a LogLocator
586+
# Note that the LogLocator is still considered the default locator
587+
# for the log scale
588+
assert ax.yaxis.isDefault_majloc
589+
assert isinstance(ax.yaxis.get_major_locator(), RadialLocator)
590+
assert isinstance(ax.yaxis.get_major_locator().base, mticker.LogLocator)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /