@@ -34,6 +34,8 @@ var position = {
3434 'right' : 1
3535} ;
3636
37+ var SI_PREFIX = / [ y z a f p n µ m k M G T P E Z Y ] / ;
38+
3739module . exports = function plot ( gd , cdModule , transitionOpts , makeOnCompleteCallback ) {
3840 var fullLayout = gd . _fullLayout ;
3941 var onComplete ;
@@ -547,6 +549,25 @@ function drawNumbers(gd, plotGroup, cd, opts) {
547549 . attr ( 'dy' , null ) ;
548550 sel . exit ( ) . remove ( ) ;
549551
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+
550571 function drawBignumber ( ) {
551572 // bignumber
552573 var bignumberAx = mockAxis ( gd , { tickformat : trace . number . valueformat } ) ;
@@ -558,23 +579,28 @@ function drawNumbers(gd, plotGroup, cd, opts) {
558579 number
559580 . call ( Drawing . font , trace . number . font ) ;
560581
582+ function writeNumber ( ) {
583+ number . text ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
584+ }
561585 if ( hasTransition ) {
562586 number
563587 . transition ( )
564588 . duration ( transitionOpts . duration )
565589 . 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 ( ) ; } )
568592 . attrTween ( 'text' , function ( ) {
569593 var that = d3 . select ( this ) ;
570594 var interpolator = d3 . interpolateNumber ( cd [ 0 ] . lastY , cd [ 0 ] . y ) ;
571595 trace . _lastValue = cd [ 0 ] . y ;
596+
597+ var transitionFmt = transitionFormat ( trace . number . valueformat , fmt , cd [ 0 ] . lastY , cd [ 0 ] . y ) ;
572598 return function ( t ) {
573- that . text ( bignumberPrefix + fmt ( interpolator ( t ) ) + bignumberSuffix ) ;
599+ that . text ( bignumberPrefix + transitionFmt ( interpolator ( t ) ) + bignumberSuffix ) ;
574600 } ;
575601 } ) ;
576602 } else {
577- number . text ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
603+ writeNumber ( ) ;
578604 }
579605
580606 bignumberbBox = measureText ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix , trace . number . font , numbersAnchor ) ;
@@ -589,9 +615,9 @@ function drawNumbers(gd, plotGroup, cd, opts) {
589615 var value = trace . delta . relative ? d . relativeDelta : d . delta ;
590616 return value ;
591617 } ;
592- var deltaFormatText = function ( value ) {
618+ var deltaFormatText = function ( value , numberFmt ) {
593619 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 ) ;
595621 } ;
596622 var deltaFill = function ( d ) {
597623 return d . delta >= 0 ? trace . delta . increasing . color : trace . delta . decreasing . color ;
@@ -604,6 +630,11 @@ function drawNumbers(gd, plotGroup, cd, opts) {
604630 . call ( Drawing . font , trace . delta . font )
605631 . call ( Color . fill , deltaFill ( { delta : trace . _deltaLastValue } ) ) ;
606632
633+ function writeDelta ( ) {
634+ delta . text ( function ( ) { return deltaFormatText ( deltaValue ( cd [ 0 ] ) , deltaFmt ) ; } )
635+ . call ( Color . fill , deltaFill ( cd [ 0 ] ) ) ;
636+ }
637+
607638 if ( hasTransition ) {
608639 delta
609640 . transition ( )
@@ -613,23 +644,21 @@ function drawNumbers(gd, plotGroup, cd, opts) {
613644 var that = d3 . select ( this ) ;
614645 var to = deltaValue ( cd [ 0 ] ) ;
615646 var from = trace . _deltaLastValue ;
647+ var transitionFmt = transitionFormat ( trace . delta . valueformat , deltaFmt , from , to ) ;
616648 var interpolator = d3 . interpolateNumber ( from , to ) ;
617649 trace . _deltaLastValue = to ;
618650 return function ( t ) {
619- that . text ( deltaFormatText ( interpolator ( t ) ) ) ;
651+ that . text ( deltaFormatText ( interpolator ( t ) , transitionFmt ) ) ;
620652 that . call ( Color . fill , deltaFill ( { delta : interpolator ( t ) } ) ) ;
621653 } ;
622654 } )
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 ( ) ; } ) ;
625657 } else {
626- delta . text ( function ( ) {
627- return deltaFormatText ( deltaValue ( cd [ 0 ] ) ) ;
628- } )
629- . call ( Color . fill , deltaFill ( cd [ 0 ] ) ) ;
658+ writeDelta ( ) ;
630659 }
631660
632- deltabBox = measureText ( deltaFormatText ( deltaValue ( cd [ 0 ] ) ) , trace . delta . font , numbersAnchor ) ;
661+ deltabBox = measureText ( deltaFormatText ( deltaValue ( cd [ 0 ] ) , deltaFmt ) , trace . delta . font , numbersAnchor ) ;
633662 return delta ;
634663 }
635664
0 commit comments