@@ -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 )
0 commit comments