@@ -629,11 +629,19 @@ function drawNumbers(gd, plotGroup, cd, opts) {
629629 return delta ;
630630 }
631631
632- // Position delta relative to bignumber
632+ var key = trace . mode + trace . align ;
633633 var delta ;
634- if ( trace . _hasDelta ) delta = drawDelta ( ) ;
635- if ( trace . _hasNumber ) drawBignumber ( ) ;
634+ if ( trace . _hasDelta ) {
635+ delta = drawDelta ( ) ;
636+ key += trace . delta . position + trace . delta . font . size + trace . delta . font . family + trace . delta . valueformat ;
637+ key += trace . delta . increasing . symbol + trace . delta . decreasing . symbol ;
638+ }
639+ if ( trace . _hasNumber ) {
640+ drawBignumber ( ) ;
641+ key += trace . number . font . size + trace . number . font . family + trace . number . valueformat + trace . number . suffix + trace . number . prefix ;
642+ }
636643
644+ // Position delta relative to bignumber
637645 if ( trace . _hasDelta && trace . _hasNumber ) {
638646 var bignumberCenter = [
639647 ( bignumberbBox . left + bignumberbBox . right ) / 2 ,
@@ -644,32 +652,32 @@ function drawNumbers(gd, plotGroup, cd, opts) {
644652 ( deltabBox . top + deltabBox . bottom ) / 2
645653 ] ;
646654
655+ var dx , dy ;
647656 if ( trace . delta . position === 'left' ) {
648- delta . attr ( 'dx ', bignumberbBox . left - deltabBox . right - cn . horizontalPadding ) ;
649- delta . attr ( 'dy' , bignumberCenter [ 1 ] - deltaCenter [ 1 ] ) ;
657+ dx = cache ( trace , 'deltaPos ', 0 , bignumberbBox . left - deltabBox . right - 0.75 * trace . delta . font . size , key , Math . min ) ;
658+ dy = bignumberCenter [ 1 ] - deltaCenter [ 1 ] ;
650659 }
651660 if ( trace . delta . position === 'right' ) {
652- delta . attr ( 'dx ', bignumberbBox . right - deltabBox . left + cn . horizontalPadding ) ;
653- delta . attr ( 'dy' , bignumberCenter [ 1 ] - deltaCenter [ 1 ] ) ;
661+ dx = cache ( trace , 'deltaPos ', 0 , bignumberbBox . right - deltabBox . left + 0.75 * trace . delta . font . size , key , Math . max ) ;
662+ dy = bignumberCenter [ 1 ] - deltaCenter [ 1 ] ;
654663 }
655664 if ( trace . delta . position === 'bottom' ) {
656- delta . attr ( 'dx' , null ) ;
657- delta . attr ( 'dy' , deltabBox . height ) ;
665+ dx = null ;
666+ dy = deltabBox . height ;
658667 }
659668 if ( trace . delta . position === 'top' ) {
660- delta . attr ( 'dx' , null ) ;
661- delta . attr ( 'dy' , bignumberbBox . top ) ;
669+ dx = null ;
670+ dy = bignumberbBox . top ;
662671 }
672+
673+ delta . attr ( { dx : dx , dy : dy } ) ;
663674 }
664675
665676 // Resize numbers to fit within space and position
666677 numbers . attr ( 'transform' , function ( ) {
667678 var m = opts . numbersScaler ( numbers ) ;
668- var key = m [ 2 ] ;
669- if ( ! ( trace . _numbersScale && trace . _numbersScale . key === key ) ) {
670- trace . _numbersScale = { key : key , value : 1 } ;
671- }
672- var scaleRatio = trace . _numbersScale . value = Math . min ( trace . _numbersScale . value , m [ 0 ] ) ;
679+ key += m [ 2 ] ;
680+ var scaleRatio = cache ( trace , 'numbersScale' , 1 , m [ 0 ] , key , Math . min ) ;
673681 var numbersbBox = m [ 1 ] ;
674682 var translateY ;
675683 if ( ! trace . _scaleNumbers ) scaleRatio = 1 ;
@@ -687,6 +695,9 @@ function drawNumbers(gd, plotGroup, cd, opts) {
687695 var ref = numbersbBox [ numbersAlign ] ;
688696 if ( numbersAlign === 'center' ) ref = ( numbersbBox . left + numbersbBox . right ) / 2 ;
689697 var translateX = numbersX - scaleRatio * ref ;
698+
699+ // Stash translateX
700+ translateX = cache ( trace , 'numbersTranslate' , 0 , translateX , key , Math . max ) ;
690701 return strTranslate ( translateX , translateY ) + ' scale(' + scaleRatio + ')' ;
691702 } ) ;
692703}
@@ -783,3 +794,14 @@ function fitTextInsideCircle(el, radius) {
783794 var ratio = radius / elRadius ;
784795 return [ ratio , textBB , radius ] ;
785796}
797+
798+ function cache ( trace , name , initialValue , value , key , fn ) {
799+ var objName = '_cache' + name ;
800+ if ( ! ( trace [ objName ] && trace [ objName ] . key === key ) ) {
801+ trace [ objName ] = { key : key , value : initialValue } ;
802+ }
803+ var v = Lib . aggNums ( fn , null , [ trace [ objName ] . value , value ] , 2 ) ;
804+ trace [ objName ] . value = v ;
805+
806+ return v ;
807+ }
0 commit comments