@@ -629,11 +629,19 @@ function drawNumbers(gd, plotGroup, cd, opts) {
629
629
return delta ;
630
630
}
631
631
632
- // Position delta relative to bignumber
632
+ var key = trace . mode + trace . align ;
633
633
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
+ }
636
643
644
+ // Position delta relative to bignumber
637
645
if ( trace . _hasDelta && trace . _hasNumber ) {
638
646
var bignumberCenter = [
639
647
( bignumberbBox . left + bignumberbBox . right ) / 2 ,
@@ -644,32 +652,32 @@ function drawNumbers(gd, plotGroup, cd, opts) {
644
652
( deltabBox . top + deltabBox . bottom ) / 2
645
653
] ;
646
654
655
+ var dx , dy ;
647
656
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 ] ;
650
659
}
651
660
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 ] ;
654
663
}
655
664
if ( trace . delta . position === 'bottom' ) {
656
- delta . attr ( 'dx' , null ) ;
657
- delta . attr ( 'dy' , deltabBox . height ) ;
665
+ dx = null ;
666
+ dy = deltabBox . height ;
658
667
}
659
668
if ( trace . delta . position === 'top' ) {
660
- delta . attr ( 'dx' , null ) ;
661
- delta . attr ( 'dy' , bignumberbBox . top ) ;
669
+ dx = null ;
670
+ dy = bignumberbBox . top ;
662
671
}
672
+
673
+ delta . attr ( { dx : dx , dy : dy } ) ;
663
674
}
664
675
665
676
// Resize numbers to fit within space and position
666
677
numbers . attr ( 'transform' , function ( ) {
667
678
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 ) ;
673
681
var numbersbBox = m [ 1 ] ;
674
682
var translateY ;
675
683
if ( ! trace . _scaleNumbers ) scaleRatio = 1 ;
@@ -687,6 +695,9 @@ function drawNumbers(gd, plotGroup, cd, opts) {
687
695
var ref = numbersbBox [ numbersAlign ] ;
688
696
if ( numbersAlign === 'center' ) ref = ( numbersbBox . left + numbersbBox . right ) / 2 ;
689
697
var translateX = numbersX - scaleRatio * ref ;
698
+
699
+ // Stash translateX
700
+ translateX = cache ( trace , 'numbersTranslate' , 0 , translateX , key , Math . max ) ;
690
701
return strTranslate ( translateX , translateY ) + ' scale(' + scaleRatio + ')' ;
691
702
} ) ;
692
703
}
@@ -783,3 +794,14 @@ function fitTextInsideCircle(el, radius) {
783
794
var ratio = radius / elRadius ;
784
795
return [ ratio , textBB , radius ] ;
785
796
}
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