Skip to content

Commit 77e2532

Browse files
committed
Ensure polar ticks are always "right-side up".
1 parent 80a5f10 commit 77e2532

File tree

1 file changed

+52
-9
lines changed

1 file changed

+52
-9
lines changed

lib/matplotlib/projections/polar.py

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,17 @@ def update_position(self, loc):
323323
self.tick2line._marker._transform = trans
324324

325325
if not _is_full_circle_deg(axes.get_thetamin(), axes.get_thetamax()):
326-
angle = np.rad2deg(angle) + self._labelrotation
327-
if self.label1On:
328-
self.label1.set_rotation(angle)
329-
if self.label2On:
330-
self.label2.set_rotation(angle)
326+
if angle > np.pi / 2:
327+
angle -= np.pi
328+
elif angle < -np.pi / 2:
329+
angle += np.pi
330+
else:
331+
angle = 0
332+
angle = np.rad2deg(angle) + self._labelrotation
333+
if self.label1On:
334+
self.label1.set_rotation(angle)
335+
if self.label2On:
336+
self.label2.set_rotation(angle)
331337

332338
# This extra padding helps preserve the look from previous releases but
333339
# is also needed because labels are anchored to their center.
@@ -495,6 +501,18 @@ def _get_text2(self):
495501
t.set_rotation_mode('anchor')
496502
return t
497503

504+
def _determine_anchor(self, angle, start):
505+
if start:
506+
if -90 <= angle <= 90:
507+
return 'left', 'center'
508+
else:
509+
return 'right', 'center'
510+
else:
511+
if -90 <= angle <= 90:
512+
return 'right', 'center'
513+
else:
514+
return 'left', 'center'
515+
498516
def update_position(self, loc):
499517
super(RadialTick, self).update_position(loc)
500518
axes = self.axes
@@ -506,16 +524,31 @@ def update_position(self, loc):
506524
full = _is_full_circle_deg(thetamin, thetamax)
507525

508526
if full:
509-
angle = 0
510-
tick_angle = np.deg2rad(angle)
527+
angle = axes.get_rlabel_position()
528+
tick_angle = 0
529+
text_angle = 0
511530
else:
512531
angle = thetamin * direction + offset - 90
513532
if direction > 0:
514533
tick_angle = np.deg2rad(angle)
515534
else:
516535
tick_angle = np.deg2rad(angle + 180)
536+
if angle > 90:
537+
text_angle = angle - 180
538+
elif angle < -90:
539+
text_angle = angle + 180
540+
else:
541+
text_angle = angle
542+
text_angle += self._labelrotation
517543
if self.label1On:
518-
self.label1.set_rotation(angle + self._labelrotation)
544+
if full:
545+
ha = 'left'
546+
va = 'bottom'
547+
else:
548+
ha, va = self._determine_anchor(angle, True)
549+
self.label1.set_ha(ha)
550+
self.label1.set_va(va)
551+
self.label1.set_rotation(text_angle)
519552
if self.tick1On:
520553
marker = self.tick1line.get_marker()
521554
if marker == mmarkers.TICKLEFT:
@@ -544,8 +577,18 @@ def update_position(self, loc):
544577
tick_angle = np.deg2rad(angle)
545578
else:
546579
tick_angle = np.deg2rad(angle + 180)
580+
if angle > 90:
581+
text_angle = angle - 180
582+
elif angle < -90:
583+
text_angle = angle + 180
584+
else:
585+
text_angle = angle
586+
text_angle += self._labelrotation
547587
if self.label2On:
548-
self.label2.set_rotation(angle + self._labelrotation)
588+
ha, va = self._determine_anchor(angle, False)
589+
self.label2.set_ha(ha)
590+
self.label2.set_va(va)
591+
self.label2.set_rotation(text_angle)
549592
if self.tick2On:
550593
marker = self.tick2line.get_marker()
551594
if marker == mmarkers.TICKLEFT:

0 commit comments

Comments
 (0)