@@ -3748,27 +3748,54 @@ axes.drawLabels = function(gd, ax, opts) {
3748
3748
} ) ;
3749
3749
} ) ;
3750
3750
3751
- if ( ( ax . tickson === 'boundaries' || ax . showdividers ) && ! opts . secondary ) {
3751
+ // autotickangles
3752
+ // if there are dividers or ticks on boundaries, the labels will be in between and
3753
+ // we need to prevent overlap with the next divider/tick. Else the labels will be on
3754
+ // the ticks and we need to prevent overlap with the next label.
3755
+
3756
+ // TODO should secondary labels also fall into this fix-overlap regime?
3757
+ var preventOverlapWithTick = ( ax . tickson === 'boundaries' || ax . showdividers ) && ! opts . secondary ;
3758
+
3759
+ var vLen = vals . length ;
3760
+ var tickSpacing = Math . abs ( ( vals [ vLen - 1 ] . x - vals [ 0 ] . x ) * ax . _m ) / ( vLen - 1 ) ;
3761
+
3762
+ var adjacent = preventOverlapWithTick ? tickSpacing / 2 : tickSpacing ;
3763
+ var opposite = preventOverlapWithTick ? ax . ticklen : maxFontSize * 1.25 * maxLines ;
3764
+ var hypotenuse = Math . sqrt ( Math . pow ( adjacent , 2 ) + Math . pow ( opposite , 2 ) ) ;
3765
+ var maxCos = adjacent / hypotenuse ;
3766
+ var autoTickAnglesRadians = ax . autotickangles . map (
3767
+ function ( degrees ) { return degrees * Math . PI / 180 ; }
3768
+ ) ;
3769
+ var angleRadians = autoTickAnglesRadians . find (
3770
+ function ( angle ) { return Math . abs ( Math . cos ( angle ) ) <= maxCos ; }
3771
+ ) ;
3772
+ if ( angleRadians === undefined ) {
3773
+ // no angle with smaller cosine than maxCos, just pick the angle with smallest cosine
3774
+ angleRadians = autoTickAnglesRadians . reduce (
3775
+ function ( currentMax , nextAngle ) {
3776
+ return Math . abs ( Math . cos ( currentMax ) ) < Math . abs ( Math . cos ( nextAngle ) ) ? currentMax : nextAngle ;
3777
+ }
3778
+ , autoTickAnglesRadians [ 0 ]
3779
+ ) ;
3780
+ }
3781
+ var newAngle = angleRadians * ( 180 / Math . PI /* to degrees */ ) ;
3782
+
3783
+ if ( preventOverlapWithTick ) {
3752
3784
var gap = 2 ;
3753
3785
if ( ax . ticks ) gap += ax . tickwidth / 2 ;
3754
3786
3755
- // TODO should secondary labels also fall into this fix-overlap regime?
3756
-
3757
3787
for ( i = 0 ; i < lbbArray . length ; i ++ ) {
3758
3788
var xbnd = vals [ i ] . xbnd ;
3759
3789
var lbb = lbbArray [ i ] ;
3760
3790
if (
3761
3791
( xbnd [ 0 ] !== null && ( lbb . left - ax . l2p ( xbnd [ 0 ] ) ) < gap ) ||
3762
3792
( xbnd [ 1 ] !== null && ( ax . l2p ( xbnd [ 1 ] ) - lbb . right ) < gap )
3763
3793
) {
3764
- autoangle = 90 ;
3794
+ autoangle = newAngle ;
3765
3795
break ;
3766
3796
}
3767
3797
}
3768
3798
} else {
3769
- var vLen = vals . length ;
3770
- var tickSpacing = Math . abs ( ( vals [ vLen - 1 ] . x - vals [ 0 ] . x ) * ax . _m ) / ( vLen - 1 ) ;
3771
-
3772
3799
var ticklabelposition = ax . ticklabelposition || '' ;
3773
3800
var has = function ( str ) {
3774
3801
return ticklabelposition . indexOf ( str ) !== - 1 ;
@@ -3779,29 +3806,7 @@ axes.drawLabels = function(gd, ax, opts) {
3779
3806
var isBottom = has ( 'bottom' ) ;
3780
3807
var isAligned = isBottom || isLeft || isTop || isRight ;
3781
3808
var pad = ! isAligned ? 0 :
3782
- ( ax . tickwidth || 0 ) + 2 * TEXTPAD ;
3783
-
3784
- // autotickangles
3785
- var adjacent = tickSpacing ;
3786
- var opposite = maxFontSize * 1.25 * maxLines ;
3787
- var hypotenuse = Math . sqrt ( Math . pow ( adjacent , 2 ) + Math . pow ( opposite , 2 ) ) ;
3788
- var maxCos = adjacent / hypotenuse ;
3789
- var autoTickAnglesRadians = ax . autotickangles . map (
3790
- function ( degrees ) { return degrees * Math . PI / 180 ; }
3791
- ) ;
3792
- var angleRadians = autoTickAnglesRadians . find (
3793
- function ( angle ) { return Math . abs ( Math . cos ( angle ) ) <= maxCos ; }
3794
- ) ;
3795
- if ( angleRadians === undefined ) {
3796
- // no angle with smaller cosine than maxCos, just pick the angle with smallest cosine
3797
- angleRadians = autoTickAnglesRadians . reduce (
3798
- function ( currentMax , nextAngle ) {
3799
- return Math . abs ( Math . cos ( currentMax ) ) < Math . abs ( Math . cos ( nextAngle ) ) ? currentMax : nextAngle ;
3800
- }
3801
- , autoTickAnglesRadians [ 0 ]
3802
- ) ;
3803
- }
3804
- var newAngle = angleRadians * ( 180 / Math . PI /* to degrees */ ) ;
3809
+ ( ax . tickwidth || 0 ) + 2 * TEXTPAD ;
3805
3810
3806
3811
for ( i = 0 ; i < lbbArray . length - 1 ; i ++ ) {
3807
3812
if ( Lib . bBoxIntersect ( lbbArray [ i ] , lbbArray [ i + 1 ] , pad ) ) {
0 commit comments