@@ -611,31 +611,43 @@ axes.calcTicks = function calcTicks(ax) {
611
611
generateTicks ( ) ;
612
612
613
613
if ( ax . rangebreaks ) {
614
- var nTicksBefore = tickVals . length ;
614
+ // replace ticks inside breaks that would get a tick
615
+ if ( ax . tickmode === 'auto' ) {
616
+ for ( var t = 0 ; t < tickVals . length ; t ++ ) {
617
+ var value = tickVals [ t ] . value ;
618
+ if ( ax . maskBreaks ( value ) === BADNUM ) {
619
+ // find which break we are in
620
+ for ( var k = 0 ; k < ax . _rangebreaks . length ; k ++ ) {
621
+ var brk = ax . _rangebreaks [ k ] ;
622
+ if ( value >= brk . min && value < brk . max ) {
623
+ tickVals [ t ] . _realV = tickVals [ t ] . value ;
624
+ tickVals [ t ] . value = brk . max ; // replace with break end
625
+ break ;
626
+ }
627
+ }
628
+ }
629
+ }
630
+ }
615
631
616
- // remove ticks falling inside rangebreaks
617
- tickVals = tickVals . filter ( function ( d ) {
618
- return ax . maskBreaks ( d . value ) !== BADNUM ;
619
- } ) ;
632
+ // reduce ticks
633
+ var len = tickVals . length ;
634
+ if ( len > 2 ) {
635
+ var tf2 = 2 * ( ax . tickfont ? ax . tickfont . size : 12 ) ;
620
636
621
- // if 'numerous' ticks get placed into rangebreaks,
622
- // increase dtick to generate more ticks,
623
- // so that some hopefully fall between rangebreaks
624
- if ( ax . tickmode === 'auto' && tickVals . length < nTicksBefore / 6 ) {
625
- axes . autoTicks ( ax , ax . _roughDTick / 3 ) ;
626
- autoTickRound ( ax ) ;
627
- ax . _tmin = axes . tickFirst ( ax ) ;
628
- generateTicks ( ) ;
629
- tickVals = tickVals . filter ( function ( d ) {
630
- return ax . maskBreaks ( d . value ) !== BADNUM ;
631
- } ) ;
632
- }
637
+ var newTickVals = [ ] ;
638
+ var prevPos ;
633
639
634
- // remove "overlapping" ticks (e.g. on either side of a break)
635
- var tf2 = ax . tickfont ? 1.5 * ax . tickfont . size : 0 ;
636
- tickVals = tickVals . filter ( function ( d , i , self ) {
637
- return ! ( i && Math . abs ( ax . c2p ( d . value ) - ax . c2p ( self [ i - 1 ] . value ) ) < tf2 ) ;
638
- } ) ;
640
+ var signAx = axrev ? - 1 : 1 ;
641
+ for ( var q = axrev ? 0 : len - 1 ; signAx * q >= signAx * ( axrev ? len - 1 : 0 ) ; q -= signAx ) { // apply reverse loop to pick greater values in breaks first
642
+ var pos = ax . c2p ( tickVals [ q ] . value ) ;
643
+
644
+ if ( prevPos === undefined || Math . abs ( pos - prevPos ) > tf2 ) {
645
+ prevPos = pos ;
646
+ newTickVals . push ( tickVals [ q ] ) ;
647
+ }
648
+ }
649
+ tickVals = newTickVals . reverse ( ) ;
650
+ }
639
651
}
640
652
641
653
// If same angle over a full circle, the last tick vals is a duplicate.
@@ -663,6 +675,16 @@ axes.calcTicks = function calcTicks(ax) {
663
675
false , // hover
664
676
tickVals [ i ] . minor // noSuffixPrefix
665
677
) ;
678
+
679
+ if ( tickVals [ i ] . _realV ) {
680
+ // correct label
681
+ ticksOut [ i ] . text = axes . tickText (
682
+ ax ,
683
+ tickVals [ i ] . _realV ,
684
+ false , // hover
685
+ tickVals [ i ] . minor // noSuffixPrefix
686
+ ) . text ;
687
+ }
666
688
}
667
689
668
690
ax . _inCalcTicks = false ;
0 commit comments