diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py
index 16d54f9d68a5..4a2c22f39901 100644
--- a/lib/matplotlib/projections/polar.py
+++ b/lib/matplotlib/projections/polar.py
@@ -300,8 +300,9 @@ def _update_padding(self, pad, angle):
def update_position(self, loc):
super(ThetaTick, self).update_position(loc)
axes = self.axes
- angle = (loc * axes.get_theta_direction() +
- axes.get_theta_offset() - np.pi / 2)
+ angle = loc * axes.get_theta_direction() + axes.get_theta_offset()
+ text_angle = np.rad2deg(angle) % 360 - 90
+ angle -= np.pi / 2
if self.tick1On:
marker = self.tick1line.get_marker()
@@ -326,17 +327,17 @@ def update_position(self, loc):
mode, user_angle = self._labelrotation
if mode == 'default':
- angle = 0
+ text_angle = user_angle
else:
- if angle > np.pi / 2:
- angle -= np.pi
- elif angle < -np.pi / 2:
- angle += np.pi
- angle = np.rad2deg(angle) + user_angle
+ if text_angle > 90:
+ text_angle -= 180
+ elif text_angle < -90:
+ text_angle += 180
+ text_angle += user_angle
if self.label1On:
- self.label1.set_rotation(angle)
+ self.label1.set_rotation(text_angle)
if self.label2On:
- self.label2.set_rotation(angle)
+ self.label2.set_rotation(text_angle)
# This extra padding helps preserve the look from previous releases but
# is also needed because labels are anchored to their center.
@@ -504,17 +505,59 @@ def _get_text2(self):
t.set_rotation_mode('anchor')
return t
- def _determine_anchor(self, angle, start):
- if start:
- if -90 <= angle <= 90:
- return 'left', 'center'
+ def _determine_anchor(self, mode, angle, start):
+ # Note: angle is the (spine angle - 90) because it's used for the tick
+ # & text setup, so all numbers below are -90 from (normed) spine angle.
+ if mode == 'auto':
+ if start:
+ if -90 <= angle <= 90:
+ return 'left', 'center'
+ else:
+ return 'right', 'center'
else:
- return 'right', 'center'
+ if -90 <= angle <= 90:
+ return 'right', 'center'
+ else:
+ return 'left', 'center'
else:
- if -90 <= angle <= 90:
- return 'right', 'center'
+ if start:
+ if angle < -68.5:
+ return 'center', 'top'
+ elif angle < -23.5:
+ return 'left', 'top'
+ elif angle < 22.5:
+ return 'left', 'center'
+ elif angle < 67.5:
+ return 'left', 'bottom'
+ elif angle < 112.5:
+ return 'center', 'bottom'
+ elif angle < 157.5:
+ return 'right', 'bottom'
+ elif angle < 202.5:
+ return 'right', 'center'
+ elif angle < 247.5:
+ return 'right', 'top'
+ else:
+ return 'center', 'top'
else:
- return 'left', 'center'
+ if angle < -68.5:
+ return 'center', 'bottom'
+ elif angle < -23.5:
+ return 'right', 'bottom'
+ elif angle < 22.5:
+ return 'right', 'center'
+ elif angle < 67.5:
+ return 'right', 'top'
+ elif angle < 112.5:
+ return 'center', 'top'
+ elif angle < 157.5:
+ return 'left', 'top'
+ elif angle < 202.5:
+ return 'left', 'center'
+ elif angle < 247.5:
+ return 'left', 'bottom'
+ else:
+ return 'center', 'bottom'
def update_position(self, loc):
super(RadialTick, self).update_position(loc)
@@ -527,7 +570,8 @@ def update_position(self, loc):
full = _is_full_circle_deg(thetamin, thetamax)
if full:
- angle = axes.get_rlabel_position() * direction + offset - 90
+ angle = (axes.get_rlabel_position() * direction +
+ offset) % 360 - 90
tick_angle = 0
if angle > 90:
text_angle = angle - 180
@@ -536,7 +580,7 @@ def update_position(self, loc):
else:
text_angle = angle
else:
- angle = thetamin * direction + offset - 90
+ angle = (thetamin * direction + offset) % 360 - 90
if direction > 0:
tick_angle = np.deg2rad(angle)
else:
@@ -557,7 +601,7 @@ def update_position(self, loc):
ha = 'left'
va = 'bottom'
else:
- ha, va = self._determine_anchor(angle, True)
+ ha, va = self._determine_anchor(mode, angle, direction > 0)
self.label1.set_ha(ha)
self.label1.set_va(va)
self.label1.set_rotation(text_angle)
@@ -584,7 +628,7 @@ def update_position(self, loc):
self.label2On = False
self.tick2On = False
else:
- angle = thetamax * direction + offset - 90
+ angle = (thetamax * direction + offset) % 360 - 90
if direction > 0:
tick_angle = np.deg2rad(angle)
else:
@@ -601,7 +645,7 @@ def update_position(self, loc):
else:
text_angle = user_angle
if self.label2On:
- ha, va = self._determine_anchor(angle, False)
+ ha, va = self._determine_anchor(mode, angle, direction < 0)
self.label2.set_ha(ha)
self.label2.set_va(va)
self.label2.set_rotation(text_angle)
@@ -888,16 +932,10 @@ def get_xaxis_transform(self, which='grid'):
return self._xaxis_transform
def get_xaxis_text1_transform(self, pad):
- if _is_full_circle_rad(*self._realViewLim.intervalx):
- return self._xaxis_text_transform, 'center', 'center'
- else:
- return self._xaxis_text_transform, 'bottom', 'center'
+ return self._xaxis_text_transform, 'center', 'center'
def get_xaxis_text2_transform(self, pad):
- if _is_full_circle_rad(*self._realViewLim.intervalx):
- return self._xaxis_text_transform, 'center', 'center'
- else:
- return self._xaxis_text_transform, 'top', 'center'
+ return self._xaxis_text_transform, 'center', 'center'
def get_yaxis_transform(self, which='grid'):
if which in ('tick1', 'tick2'):
@@ -1072,10 +1110,6 @@ def set_theta_direction(self, direction):
raise ValueError(
"direction must be 1, -1, clockwise or counterclockwise")
self._direction.invalidate()
- # FIXME: Why is this needed? Even though the tick label gets
- # re-created, the alignment is not correctly updated without a reset.
- self.yaxis.reset_ticks()
- self.yaxis.set_clip_path(self.patch)
def get_theta_direction(self):
"""
@@ -1132,8 +1166,6 @@ def set_rlabel_position(self, value):
The angular position of the radius labels in degrees.
"""
self._r_label_position.clear().translate(np.deg2rad(value), 0.0)
- self.yaxis.reset_ticks()
- self.yaxis.set_clip_path(self.patch)
def set_yscale(self, *args, **kwargs):
Axes.set_yscale(self, *args, **kwargs)
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.pdf
index 64ccc93fdae5..87539484bbc5 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.pdf and b/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.png
index 91986a07f187..262ac6cc6363 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.png and b/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.svg b/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.svg
index 26bc1035b646..d0c9ffd8f920 100644
--- a/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.svg
+++ b/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_wedge.svg
@@ -32,7 +32,7 @@ z