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

Appearance settings

Commit ea16202

Browse filesBrowse 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
Copy full SHA for ea16202

File tree

Expand file treeCollapse file tree

5 files changed

+3432
-784
lines changed
Filter options
Expand file treeCollapse file tree

5 files changed

+3432
-784
lines changed

‎lib/matplotlib/projections/polar.py

Copy file name to clipboardExpand all lines: lib/matplotlib/projections/polar.py
+69-37Lines 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.
Loading

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.