Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ea16202

Browse files
authored
Merge pull request #9909 from matplotlib/auto-backport-of-pr-9881
Backport PR #9881 on branch v2.1.x
2 parents c181d13 + 83f9c51 commit ea16202

File tree

5 files changed

+3432
-784
lines changed

5 files changed

+3432
-784
lines changed

lib/matplotlib/projections/polar.py

Lines changed: 69 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,9 @@ def _update_padding(self, pad, angle):
300300
def update_position(self, loc):
301301
super(ThetaTick, self).update_position(loc)
302302
axes = self.axes
303-
angle = (loc * axes.get_theta_direction() +
304-
axes.get_theta_offset() - np.pi / 2)
303+
angle = loc * axes.get_theta_direction() + axes.get_theta_offset()
304+
text_angle = np.rad2deg(angle) % 360 - 90
305+
angle -= np.pi / 2
305306

306307
if self.tick1On:
307308
marker = self.tick1line.get_marker()
@@ -326,17 +327,17 @@ def update_position(self, loc):
326327

327328
mode, user_angle = self._labelrotation
328329
if mode == 'default':
329-
angle = 0
330+
text_angle = user_angle
330331
else:
331-
if angle > np.pi / 2:
332-
angle -= np.pi
333-
elif angle < -np.pi / 2:
334-
angle += np.pi
335-
angle = np.rad2deg(angle) + user_angle
332+
if text_angle > 90:
333+
text_angle -= 180
334+
elif text_angle < -90:
335+
text_angle += 180
336+
text_angle += user_angle
336337
if self.label1On:
337-
self.label1.set_rotation(angle)
338+
self.label1.set_rotation(text_angle)
338339
if self.label2On:
339-
self.label2.set_rotation(angle)
340+
self.label2.set_rotation(text_angle)
340341

341342
# This extra padding helps preserve the look from previous releases but
342343
# is also needed because labels are anchored to their center.
@@ -504,17 +505,59 @@ def _get_text2(self):
504505
t.set_rotation_mode('anchor')
505506
return t
506507

507-
def _determine_anchor(self, angle, start):
508-
if start:
509-
if -90 <= angle <= 90:
510-
return 'left', 'center'
508+
def _determine_anchor(self, mode, angle, start):
509+
# Note: angle is the (spine angle - 90) because it's used for the tick
510+
# & text setup, so all numbers below are -90 from (normed) spine angle.
511+
if mode == 'auto':
512+
if start:
513+
if -90 <= angle <= 90:
514+
return 'left', 'center'
515+
else:
516+
return 'right', 'center'
511517
else:
512-
return 'right', 'center'
518+
if -90 <= angle <= 90:
519+
return 'right', 'center'
520+
else:
521+
return 'left', 'center'
513522
else:
514-
if -90 <= angle <= 90:
515-
return 'right', 'center'
523+
if start:
524+
if angle < -68.5:
525+
return 'center', 'top'
526+
elif angle < -23.5:
527+
return 'left', 'top'
528+
elif angle < 22.5:
529+
return 'left', 'center'
530+
elif angle < 67.5:
531+
return 'left', 'bottom'
532+
elif angle < 112.5:
533+
return 'center', 'bottom'
534+
elif angle < 157.5:
535+
return 'right', 'bottom'
536+
elif angle < 202.5:
537+
return 'right', 'center'
538+
elif angle < 247.5:
539+
return 'right', 'top'
540+
else:
541+
return 'center', 'top'
516542
else:
517-
return 'left', 'center'
543+
if angle < -68.5:
544+
return 'center', 'bottom'
545+
elif angle < -23.5:
546+
return 'right', 'bottom'
547+
elif angle < 22.5:
548+
return 'right', 'center'
549+
elif angle < 67.5:
550+
return 'right', 'top'
551+
elif angle < 112.5:
552+
return 'center', 'top'
553+
elif angle < 157.5:
554+
return 'left', 'top'
555+
elif angle < 202.5:
556+
return 'left', 'center'
557+
elif angle < 247.5:
558+
return 'left', 'bottom'
559+
else:
560+
return 'center', 'bottom'
518561

519562
def update_position(self, loc):
520563
super(RadialTick, self).update_position(loc)
@@ -527,7 +570,8 @@ def update_position(self, loc):
527570
full = _is_full_circle_deg(thetamin, thetamax)
528571

529572
if full:
530-
angle = axes.get_rlabel_position() * direction + offset - 90
573+
angle = (axes.get_rlabel_position() * direction +
574+
offset) % 360 - 90
531575
tick_angle = 0
532576
if angle > 90:
533577
text_angle = angle - 180
@@ -536,7 +580,7 @@ def update_position(self, loc):
536580
else:
537581
text_angle = angle
538582
else:
539-
angle = thetamin * direction + offset - 90
583+
angle = (thetamin * direction + offset) % 360 - 90
540584
if direction > 0:
541585
tick_angle = np.deg2rad(angle)
542586
else:
@@ -557,7 +601,7 @@ def update_position(self, loc):
557601
ha = 'left'
558602
va = 'bottom'
559603
else:
560-
ha, va = self._determine_anchor(angle, True)
604+
ha, va = self._determine_anchor(mode, angle, direction > 0)
561605
self.label1.set_ha(ha)
562606
self.label1.set_va(va)
563607
self.label1.set_rotation(text_angle)
@@ -584,7 +628,7 @@ def update_position(self, loc):
584628
self.label2On = False
585629
self.tick2On = False
586630
else:
587-
angle = thetamax * direction + offset - 90
631+
angle = (thetamax * direction + offset) % 360 - 90
588632
if direction > 0:
589633
tick_angle = np.deg2rad(angle)
590634
else:
@@ -601,7 +645,7 @@ def update_position(self, loc):
601645
else:
602646
text_angle = user_angle
603647
if self.label2On:
604-
ha, va = self._determine_anchor(angle, False)
648+
ha, va = self._determine_anchor(mode, angle, direction < 0)
605649
self.label2.set_ha(ha)
606650
self.label2.set_va(va)
607651
self.label2.set_rotation(text_angle)
@@ -888,16 +932,10 @@ def get_xaxis_transform(self, which='grid'):
888932
return self._xaxis_transform
889933

890934
def get_xaxis_text1_transform(self, pad):
891-
if _is_full_circle_rad(*self._realViewLim.intervalx):
892-
return self._xaxis_text_transform, 'center', 'center'
893-
else:
894-
return self._xaxis_text_transform, 'bottom', 'center'
935+
return self._xaxis_text_transform, 'center', 'center'
895936

896937
def get_xaxis_text2_transform(self, pad):
897-
if _is_full_circle_rad(*self._realViewLim.intervalx):
898-
return self._xaxis_text_transform, 'center', 'center'
899-
else:
900-
return self._xaxis_text_transform, 'top', 'center'
938+
return self._xaxis_text_transform, 'center', 'center'
901939

902940
def get_yaxis_transform(self, which='grid'):
903941
if which in ('tick1', 'tick2'):
@@ -1072,10 +1110,6 @@ def set_theta_direction(self, direction):
10721110
raise ValueError(
10731111
"direction must be 1, -1, clockwise or counterclockwise")
10741112
self._direction.invalidate()
1075-
# FIXME: Why is this needed? Even though the tick label gets
1076-
# re-created, the alignment is not correctly updated without a reset.
1077-
self.yaxis.reset_ticks()
1078-
self.yaxis.set_clip_path(self.patch)
10791113

10801114
def get_theta_direction(self):
10811115
"""
@@ -1132,8 +1166,6 @@ def set_rlabel_position(self, value):
11321166
The angular position of the radius labels in degrees.
11331167
"""
11341168
self._r_label_position.clear().translate(np.deg2rad(value), 0.0)
1135-
self.yaxis.reset_ticks()
1136-
self.yaxis.set_clip_path(self.patch)
11371169

11381170
def set_yscale(self, *args, **kwargs):
11391171
Axes.set_yscale(self, *args, **kwargs)
Binary file not shown.

0 commit comments

Comments
 (0)