@@ -34,6 +34,8 @@ var position = {
34
34
'right' : 1
35
35
} ;
36
36
37
+ var SI_PREFIX = / [ y z a f p n µ m k M G T P E Z Y ] / ;
38
+
37
39
module . exports = function plot ( gd , cdModule , transitionOpts , makeOnCompleteCallback ) {
38
40
var fullLayout = gd . _fullLayout ;
39
41
var onComplete ;
@@ -547,6 +549,25 @@ function drawNumbers(gd, plotGroup, cd, opts) {
547
549
. attr ( 'dy' , null ) ;
548
550
sel . exit ( ) . remove ( ) ;
549
551
552
+ // Function to override the number formatting used during transitions
553
+ function transitionFormat ( valueformat , fmt , from , to ) {
554
+ // For now, do not display SI prefix if start and end value do not have any
555
+ if ( valueformat . match ( 's' ) && // If using SI prefix
556
+ ( from >= 0 !== to >= 0 ) && // If sign change
557
+ ( ! fmt ( from ) . slice ( - 1 ) . match ( SI_PREFIX ) && ! fmt ( to ) . slice ( - 1 ) . match ( SI_PREFIX ) ) // Has no SI prefix
558
+ ) {
559
+ var transitionValueFormat = valueformat . slice ( ) . replace ( 's' , 'f' ) . replace ( / \d + / , function ( m ) { return parseInt ( m ) - 1 ; } ) ;
560
+ var transitionAx = mockAxis ( gd , { tickformat : transitionValueFormat } ) ;
561
+ return function ( v ) {
562
+ // Switch to fixed precision if number is smaller than one
563
+ if ( Math . abs ( v ) < 1 ) return Axes . tickText ( transitionAx , v ) . text ;
564
+ return fmt ( v ) ;
565
+ } ;
566
+ } else {
567
+ return fmt ;
568
+ }
569
+ }
570
+
550
571
function drawBignumber ( ) {
551
572
// bignumber
552
573
var bignumberAx = mockAxis ( gd , { tickformat : trace . number . valueformat } ) ;
@@ -558,23 +579,28 @@ function drawNumbers(gd, plotGroup, cd, opts) {
558
579
number
559
580
. call ( Drawing . font , trace . number . font ) ;
560
581
582
+ function writeNumber ( ) {
583
+ number . text ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
584
+ }
561
585
if ( hasTransition ) {
562
586
number
563
587
. transition ( )
564
588
. duration ( transitionOpts . duration )
565
589
. ease ( transitionOpts . easing )
566
- . each ( 'end' , function ( ) { onComplete && onComplete ( ) ; } )
567
- . each ( 'interrupt' , function ( ) { onComplete && onComplete ( ) ; } )
590
+ . each ( 'end' , function ( ) { writeNumber ( ) ; onComplete && onComplete ( ) ; } )
591
+ . each ( 'interrupt' , function ( ) { writeNumber ( ) ; onComplete && onComplete ( ) ; } )
568
592
. attrTween ( 'text' , function ( ) {
569
593
var that = d3 . select ( this ) ;
570
594
var interpolator = d3 . interpolateNumber ( cd [ 0 ] . lastY , cd [ 0 ] . y ) ;
571
595
trace . _lastValue = cd [ 0 ] . y ;
596
+
597
+ var transitionFmt = transitionFormat ( trace . number . valueformat , fmt , cd [ 0 ] . lastY , cd [ 0 ] . y ) ;
572
598
return function ( t ) {
573
- that . text ( bignumberPrefix + fmt ( interpolator ( t ) ) + bignumberSuffix ) ;
599
+ that . text ( bignumberPrefix + transitionFmt ( interpolator ( t ) ) + bignumberSuffix ) ;
574
600
} ;
575
601
} ) ;
576
602
} else {
577
- number . text ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
603
+ writeNumber ( ) ;
578
604
}
579
605
580
606
bignumberbBox = measureText ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix , trace . number . font , numbersAnchor ) ;
@@ -589,9 +615,9 @@ function drawNumbers(gd, plotGroup, cd, opts) {
589
615
var value = trace . delta . relative ? d . relativeDelta : d . delta ;
590
616
return value ;
591
617
} ;
592
- var deltaFormatText = function ( value ) {
618
+ var deltaFormatText = function ( value , numberFmt ) {
593
619
if ( value === 0 ) return '-' ;
594
- return ( value > 0 ? trace . delta . increasing . symbol : trace . delta . decreasing . symbol ) + deltaFmt ( value ) ;
620
+ return ( value > 0 ? trace . delta . increasing . symbol : trace . delta . decreasing . symbol ) + numberFmt ( value ) ;
595
621
} ;
596
622
var deltaFill = function ( d ) {
597
623
return d . delta >= 0 ? trace . delta . increasing . color : trace . delta . decreasing . color ;
@@ -604,6 +630,11 @@ function drawNumbers(gd, plotGroup, cd, opts) {
604
630
. call ( Drawing . font , trace . delta . font )
605
631
. call ( Color . fill , deltaFill ( { delta : trace . _deltaLastValue } ) ) ;
606
632
633
+ function writeDelta ( ) {
634
+ delta . text ( function ( ) { return deltaFormatText ( deltaValue ( cd [ 0 ] ) , deltaFmt ) ; } )
635
+ . call ( Color . fill , deltaFill ( cd [ 0 ] ) ) ;
636
+ }
637
+
607
638
if ( hasTransition ) {
608
639
delta
609
640
. transition ( )
@@ -613,23 +644,21 @@ function drawNumbers(gd, plotGroup, cd, opts) {
613
644
var that = d3 . select ( this ) ;
614
645
var to = deltaValue ( cd [ 0 ] ) ;
615
646
var from = trace . _deltaLastValue ;
647
+ var transitionFmt = transitionFormat ( trace . delta . valueformat , deltaFmt , from , to ) ;
616
648
var interpolator = d3 . interpolateNumber ( from , to ) ;
617
649
trace . _deltaLastValue = to ;
618
650
return function ( t ) {
619
- that . text ( deltaFormatText ( interpolator ( t ) ) ) ;
651
+ that . text ( deltaFormatText ( interpolator ( t ) , transitionFmt ) ) ;
620
652
that . call ( Color . fill , deltaFill ( { delta : interpolator ( t ) } ) ) ;
621
653
} ;
622
654
} )
623
- . each ( 'end' , function ( ) { onComplete && onComplete ( ) ; } )
624
- . each ( 'interrupt' , function ( ) { onComplete && onComplete ( ) ; } ) ;
655
+ . each ( 'end' , function ( ) { writeDelta ( ) ; onComplete && onComplete ( ) ; } )
656
+ . each ( 'interrupt' , function ( ) { writeDelta ( ) ; onComplete && onComplete ( ) ; } ) ;
625
657
} else {
626
- delta . text ( function ( ) {
627
- return deltaFormatText ( deltaValue ( cd [ 0 ] ) ) ;
628
- } )
629
- . call ( Color . fill , deltaFill ( cd [ 0 ] ) ) ;
658
+ writeDelta ( ) ;
630
659
}
631
660
632
- deltabBox = measureText ( deltaFormatText ( deltaValue ( cd [ 0 ] ) ) , trace . delta . font , numbersAnchor ) ;
661
+ deltabBox = measureText ( deltaFormatText ( deltaValue ( cd [ 0 ] ) , deltaFmt ) , trace . delta . font , numbersAnchor ) ;
633
662
return delta ;
634
663
}
635
664
0 commit comments