@@ -300,8 +300,9 @@ def _update_padding(self, pad, angle):
300
300
def update_position (self , loc ):
301
301
super (ThetaTick , self ).update_position (loc )
302
302
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
305
306
306
307
if self .tick1On :
307
308
marker = self .tick1line .get_marker ()
@@ -326,17 +327,17 @@ def update_position(self, loc):
326
327
327
328
mode , user_angle = self ._labelrotation
328
329
if mode == 'default' :
329
- angle = 0
330
+ text_angle = user_angle
330
331
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
336
337
if self .label1On :
337
- self .label1 .set_rotation (angle )
338
+ self .label1 .set_rotation (text_angle )
338
339
if self .label2On :
339
- self .label2 .set_rotation (angle )
340
+ self .label2 .set_rotation (text_angle )
340
341
341
342
# This extra padding helps preserve the look from previous releases but
342
343
# is also needed because labels are anchored to their center.
@@ -504,17 +505,59 @@ def _get_text2(self):
504
505
t .set_rotation_mode ('anchor' )
505
506
return t
506
507
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'
511
517
else :
512
- return 'right' , 'center'
518
+ if - 90 <= angle <= 90 :
519
+ return 'right' , 'center'
520
+ else :
521
+ return 'left' , 'center'
513
522
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'
516
542
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'
518
561
519
562
def update_position (self , loc ):
520
563
super (RadialTick , self ).update_position (loc )
@@ -527,7 +570,8 @@ def update_position(self, loc):
527
570
full = _is_full_circle_deg (thetamin , thetamax )
528
571
529
572
if full :
530
- angle = axes .get_rlabel_position () * direction + offset - 90
573
+ angle = (axes .get_rlabel_position () * direction +
574
+ offset ) % 360 - 90
531
575
tick_angle = 0
532
576
if angle > 90 :
533
577
text_angle = angle - 180
@@ -536,7 +580,7 @@ def update_position(self, loc):
536
580
else :
537
581
text_angle = angle
538
582
else :
539
- angle = thetamin * direction + offset - 90
583
+ angle = ( thetamin * direction + offset ) % 360 - 90
540
584
if direction > 0 :
541
585
tick_angle = np .deg2rad (angle )
542
586
else :
@@ -557,7 +601,7 @@ def update_position(self, loc):
557
601
ha = 'left'
558
602
va = 'bottom'
559
603
else :
560
- ha , va = self ._determine_anchor (angle , True )
604
+ ha , va = self ._determine_anchor (mode , angle , direction > 0 )
561
605
self .label1 .set_ha (ha )
562
606
self .label1 .set_va (va )
563
607
self .label1 .set_rotation (text_angle )
@@ -584,7 +628,7 @@ def update_position(self, loc):
584
628
self .label2On = False
585
629
self .tick2On = False
586
630
else :
587
- angle = thetamax * direction + offset - 90
631
+ angle = ( thetamax * direction + offset ) % 360 - 90
588
632
if direction > 0 :
589
633
tick_angle = np .deg2rad (angle )
590
634
else :
@@ -601,7 +645,7 @@ def update_position(self, loc):
601
645
else :
602
646
text_angle = user_angle
603
647
if self .label2On :
604
- ha , va = self ._determine_anchor (angle , False )
648
+ ha , va = self ._determine_anchor (mode , angle , direction < 0 )
605
649
self .label2 .set_ha (ha )
606
650
self .label2 .set_va (va )
607
651
self .label2 .set_rotation (text_angle )
@@ -888,16 +932,10 @@ def get_xaxis_transform(self, which='grid'):
888
932
return self ._xaxis_transform
889
933
890
934
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'
895
936
896
937
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'
901
939
902
940
def get_yaxis_transform (self , which = 'grid' ):
903
941
if which in ('tick1' , 'tick2' ):
@@ -1072,10 +1110,6 @@ def set_theta_direction(self, direction):
1072
1110
raise ValueError (
1073
1111
"direction must be 1, -1, clockwise or counterclockwise" )
1074
1112
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 )
1079
1113
1080
1114
def get_theta_direction (self ):
1081
1115
"""
@@ -1132,8 +1166,6 @@ def set_rlabel_position(self, value):
1132
1166
The angular position of the radius labels in degrees.
1133
1167
"""
1134
1168
self ._r_label_position .clear ().translate (np .deg2rad (value ), 0.0 )
1135
- self .yaxis .reset_ticks ()
1136
- self .yaxis .set_clip_path (self .patch )
1137
1169
1138
1170
def set_yscale (self , * args , ** kwargs ):
1139
1171
Axes .set_yscale (self , * args , ** kwargs )
0 commit comments