5
5
6
6
import numpy as np
7
7
8
+ import matplotlib .artist as martist
8
9
from matplotlib .axes import Axes
9
10
import matplotlib .axis as maxis
10
11
from matplotlib import cbook
@@ -378,8 +379,29 @@ class _ThetaTick(maxis.XTick):
378
379
This subclass of `XTick` provides angular ticks with some small
379
380
modification to their re-positioning such that ticks are rotated based on
380
381
tick location. This results in ticks that are correctly perpendicular to
381
- the arc spine. Labels are also rotated to be parallel to the spine.
382
+ the arc spine.
383
+
384
+ Labels are also rotated to be parallel to the spine. The label padding is
385
+ also applied here since it's not possible to use a generic axes transform
386
+ to produce tick-specific padding.
382
387
"""
388
+ def __init__ (self , axes , * args , ** kwargs ):
389
+ maxis .XTick .__init__ (self , axes , * args , ** kwargs )
390
+ self ._text1_translate = mtransforms .ScaledTranslation (
391
+ 0 , 0 ,
392
+ axes .figure .dpi_scale_trans )
393
+ self ._text2_translate = mtransforms .ScaledTranslation (
394
+ 0 , 0 ,
395
+ axes .figure .dpi_scale_trans )
396
+
397
+ def _update_padding (self , angle ):
398
+ padx = self ._pad * np .cos (angle ) / 72
399
+ pady = self ._pad * np .sin (angle ) / 72
400
+ self ._text1_translate ._t = (padx , pady )
401
+ self ._text1_translate .invalidate ()
402
+ self ._text2_translate ._t = (- padx , - pady )
403
+ self ._text2_translate .invalidate ()
404
+
383
405
def _get_text1 (self ):
384
406
t = maxis .XTick ._get_text1 (self )
385
407
t .set_rotation_mode ('anchor' )
@@ -422,6 +444,23 @@ def update_position(self, loc):
422
444
if self .label2On :
423
445
self .label2 .set_rotation (np .rad2deg (angle ) + self ._labelrotation )
424
446
447
+ @martist .allow_rasterization
448
+ def draw (self , renderer ):
449
+ axes = self .axes
450
+ self ._update_padding (self ._loc * axes .get_theta_direction () +
451
+ axes .get_theta_offset ())
452
+
453
+ # Add the padding shift to the label. This can't be applied to the
454
+ # transform by default because Axis likes to copy ticks/transforms,
455
+ # leaving every one with the same padding direction.
456
+ trans1 = self .label1 .get_transform ()
457
+ self .label1 .set_transform (trans1 + self ._text1_translate )
458
+ trans2 = self .label2 .get_transform ()
459
+ self .label2 .set_transform (trans2 + self ._text2_translate )
460
+ maxis .XTick .draw (self , renderer )
461
+ self .label1 .set_transform (trans1 )
462
+ self .label2 .set_transform (trans2 )
463
+
425
464
426
465
class _ThetaAxis (maxis .XAxis ):
427
466
"""
@@ -736,14 +775,7 @@ def _set_lim_and_transforms(self):
736
775
.translate (0.0 , - 0.5 ) \
737
776
.scale (1.0 , - 1.0 ) \
738
777
.translate (0.0 , 0.5 )
739
- self ._xaxis_text1_transform = (
740
- flipr_transform +
741
- mtransforms .Affine2D ().translate (0.0 , 0.1 ) +
742
- self ._xaxis_transform )
743
- self ._xaxis_text2_transform = (
744
- flipr_transform +
745
- mtransforms .Affine2D ().translate (0.0 , - 0.1 ) +
746
- self ._xaxis_transform )
778
+ self ._xaxis_text_transform = flipr_transform + self ._xaxis_transform
747
779
748
780
# This is the transform for r-axis ticks. It scales the theta
749
781
# axis so the gridlines from 0.0 to 1.0, now go from thetamin to
@@ -766,10 +798,10 @@ def get_xaxis_transform(self, which='grid'):
766
798
return self ._xaxis_transform
767
799
768
800
def get_xaxis_text1_transform (self , pad ):
769
- return self ._xaxis_text1_transform , 'bottom' , 'center'
801
+ return self ._xaxis_text_transform , 'bottom' , 'center'
770
802
771
803
def get_xaxis_text2_transform (self , pad ):
772
- return self ._xaxis_text2_transform , 'top' , 'center'
804
+ return self ._xaxis_text_transform , 'top' , 'center'
773
805
774
806
def get_yaxis_transform (self , which = 'grid' ):
775
807
if which in ('tick1' , 'tick2' ):
0 commit comments