@@ -527,6 +527,7 @@ function drawNumbers(gd, plotGroup, cd, opts) {
527
527
528
528
var numbers = Lib . ensureSingle ( plotGroup , 'g' , 'numbers' ) ;
529
529
var bignumberbBox , deltabBox ;
530
+ var numbersbBox ;
530
531
531
532
var data = [ ] ;
532
533
if ( trace . _hasNumber ) data . push ( 'number' ) ;
@@ -575,9 +576,7 @@ function drawNumbers(gd, plotGroup, cd, opts) {
575
576
number . text ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
576
577
}
577
578
578
- number . attr ( 'data-unformatted' , bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
579
- bignumberbBox = Drawing . bBox ( number . node ( ) ) ;
580
-
579
+ bignumberbBox = measureText ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix , trace . number . font , numbersAnchor ) ;
581
580
return number ;
582
581
}
583
582
@@ -629,9 +628,7 @@ function drawNumbers(gd, plotGroup, cd, opts) {
629
628
. call ( Color . fill , deltaFill ( cd [ 0 ] ) ) ;
630
629
}
631
630
632
- delta . attr ( 'data-unformatted' , deltaFormatText ( deltaValue ( cd [ 0 ] ) ) ) ;
633
- deltabBox = Drawing . bBox ( delta . node ( ) ) ;
634
-
631
+ deltabBox = measureText ( deltaFormatText ( deltaValue ( cd [ 0 ] ) ) , trace . delta . font , numbersAnchor ) ;
635
632
return delta ;
636
633
}
637
634
@@ -641,10 +638,12 @@ function drawNumbers(gd, plotGroup, cd, opts) {
641
638
delta = drawDelta ( ) ;
642
639
key += trace . delta . position + trace . delta . font . size + trace . delta . font . family + trace . delta . valueformat ;
643
640
key += trace . delta . increasing . symbol + trace . delta . decreasing . symbol ;
641
+ numbersbBox = deltabBox ;
644
642
}
645
643
if ( trace . _hasNumber ) {
646
644
drawBignumber ( ) ;
647
645
key += trace . number . font . size + trace . number . font . family + trace . number . valueformat + trace . number . suffix + trace . number . prefix ;
646
+ numbersbBox = bignumberbBox ;
648
647
}
649
648
650
649
// Position delta relative to bignumber
@@ -659,53 +658,91 @@ function drawNumbers(gd, plotGroup, cd, opts) {
659
658
] ;
660
659
661
660
var dx , dy ;
661
+ var padding = 0.75 * trace . delta . font . size ;
662
662
if ( trace . delta . position === 'left' ) {
663
- dx = cache ( trace , 'deltaPos' , 0 , bignumberbBox . left - deltabBox . right - 0.75 * trace . delta . font . size , key , Math . min ) ;
663
+ dx = cache ( trace , 'deltaPos' , 0 , - 1 * ( bignumberbBox . width * ( position [ trace . align ] ) + deltabBox . width * ( 1 - position [ trace . align ] ) + padding ) , key , Math . min ) ;
664
664
dy = bignumberCenter [ 1 ] - deltaCenter [ 1 ] ;
665
+
666
+ numbersbBox = {
667
+ width : bignumberbBox . width + deltabBox . width + padding ,
668
+ height : Math . max ( bignumberbBox . height , deltabBox . height ) ,
669
+ left : deltabBox . left + dx ,
670
+ right : bignumberbBox . right ,
671
+ top : Math . min ( bignumberbBox . top , deltabBox . top + dy ) ,
672
+ bottom : Math . max ( bignumberbBox . bottom , deltabBox . bottom + dy )
673
+ } ;
665
674
}
666
675
if ( trace . delta . position === 'right' ) {
667
- dx = cache ( trace , 'deltaPos' , 0 , bignumberbBox . right - deltabBox . left + 0.75 * trace . delta . font . size , key , Math . max ) ;
676
+ dx = cache ( trace , 'deltaPos' , 0 , bignumberbBox . width * ( 1 - position [ trace . align ] ) + deltabBox . width * position [ trace . align ] + padding , key , Math . max ) ;
668
677
dy = bignumberCenter [ 1 ] - deltaCenter [ 1 ] ;
678
+
679
+ numbersbBox = {
680
+ width : bignumberbBox . width + deltabBox . width + padding ,
681
+ height : Math . max ( bignumberbBox . height , deltabBox . height ) ,
682
+ left : bignumberbBox . left ,
683
+ right : deltabBox . right + dx ,
684
+ top : Math . min ( bignumberbBox . top , deltabBox . top + dy ) ,
685
+ bottom : Math . max ( bignumberbBox . bottom , deltabBox . bottom + dy )
686
+ } ;
669
687
}
670
688
if ( trace . delta . position === 'bottom' ) {
671
689
dx = null ;
672
690
dy = deltabBox . height ;
691
+
692
+ numbersbBox = {
693
+ width : Math . max ( bignumberbBox . width , deltabBox . width ) ,
694
+ height : bignumberbBox . height + deltabBox . height ,
695
+ left : Math . min ( bignumberbBox . left , deltabBox . left ) ,
696
+ right : Math . max ( bignumberbBox . right , deltabBox . right ) ,
697
+ top : bignumberbBox . bottom - bignumberbBox . height ,
698
+ bottom : bignumberbBox . bottom + deltabBox . height
699
+ } ;
673
700
}
674
701
if ( trace . delta . position === 'top' ) {
675
702
dx = null ;
676
703
dy = bignumberbBox . top ;
704
+
705
+ numbersbBox = {
706
+ width : Math . max ( bignumberbBox . width , deltabBox . width ) ,
707
+ height : bignumberbBox . height + deltabBox . height ,
708
+ left : Math . min ( bignumberbBox . left , deltabBox . left ) ,
709
+ right : Math . max ( bignumberbBox . right , deltabBox . right ) ,
710
+ top : bignumberbBox . bottom - bignumberbBox . height - deltabBox . height ,
711
+ bottom : bignumberbBox . bottom
712
+ } ;
677
713
}
678
714
679
715
delta . attr ( { dx : dx , dy : dy } ) ;
680
716
}
681
717
682
718
// Resize numbers to fit within space and position
683
- numbers . attr ( 'transform' , function ( ) {
684
- var m = opts . numbersScaler ( numbers ) ;
685
- key += m [ 2 ] ;
686
- var scaleRatio = cache ( trace , 'numbersScale' , 1 , m [ 0 ] , key , Math . min ) ;
687
- var numbersbBox = m [ 1 ] ;
688
- var translateY ;
689
- if ( ! trace . _scaleNumbers ) scaleRatio = 1 ;
690
- if ( trace . _isAngular ) {
691
- // align vertically to bottom
692
- translateY = numbersY - scaleRatio * numbersbBox . bottom ;
693
- } else {
694
- // align vertically to center
695
- translateY = numbersY - scaleRatio * ( numbersbBox . top + numbersbBox . bottom ) / 2 ;
696
- }
719
+ if ( trace . _hasNumber || trace . _hasDelta ) {
720
+ numbers . attr ( 'transform' , function ( ) {
721
+ var m = opts . numbersScaler ( numbersbBox ) ;
722
+ key += m [ 2 ] ;
723
+ var scaleRatio = cache ( trace , 'numbersScale' , 1 , m [ 0 ] , key , Math . min ) ;
724
+ var translateY ;
725
+ if ( ! trace . _scaleNumbers ) scaleRatio = 1 ;
726
+ if ( trace . _isAngular ) {
727
+ // align vertically to bottom
728
+ translateY = numbersY - scaleRatio * numbersbBox . bottom ;
729
+ } else {
730
+ // align vertically to center
731
+ translateY = numbersY - scaleRatio * ( numbersbBox . top + numbersbBox . bottom ) / 2 ;
732
+ }
697
733
698
- // Stash the top position of numbersbBox for title positioning
699
- trace . _numbersTop = scaleRatio * ( numbersbBox . top ) + translateY ;
734
+ // Stash the top position of numbersbBox for title positioning
735
+ trace . _numbersTop = scaleRatio * ( numbersbBox . top ) + translateY ;
700
736
701
- var ref = numbersbBox [ numbersAlign ] ;
702
- if ( numbersAlign === 'center' ) ref = ( numbersbBox . left + numbersbBox . right ) / 2 ;
703
- var translateX = numbersX - scaleRatio * ref ;
737
+ var ref = numbersbBox [ numbersAlign ] ;
738
+ if ( numbersAlign === 'center' ) ref = ( numbersbBox . left + numbersbBox . right ) / 2 ;
739
+ var translateX = numbersX - scaleRatio * ref ;
704
740
705
- // Stash translateX
706
- translateX = cache ( trace , 'numbersTranslate' , 0 , translateX , key , Math . max ) ;
707
- return strTranslate ( translateX , translateY ) + ' scale(' + scaleRatio + ')' ;
708
- } ) ;
741
+ // Stash translateX
742
+ translateX = cache ( trace , 'numbersTranslate' , 0 , translateX , key , Math . max ) ;
743
+ return strTranslate ( translateX , translateY ) + ' scale(' + scaleRatio + ')' ;
744
+ } ) ;
745
+ }
709
746
}
710
747
711
748
// Apply fill, stroke, stroke-width to SVG shape
@@ -786,21 +823,33 @@ function strTranslate(x, y) {
786
823
return 'translate(' + x + ',' + y + ')' ;
787
824
}
788
825
789
- function fitTextInsideBox ( el , width , height ) {
826
+ function fitTextInsideBox ( textBB , width , height ) {
790
827
// compute scaling ratio to have text fit within specified width and height
791
- var textBB = Drawing . bBox ( el . node ( ) ) ;
828
+ // var textBB = Drawing.bBox(el.node());
792
829
var ratio = Math . min ( width / textBB . width , height / textBB . height ) ;
793
830
return [ ratio , textBB , width + 'x' + height ] ;
794
831
}
795
832
796
- function fitTextInsideCircle ( el , radius ) {
833
+ function fitTextInsideCircle ( textBB , radius ) {
797
834
// compute scaling ratio to have text fit within specified radius
798
- var textBB = Drawing . bBox ( el . node ( ) ) ;
835
+ // var textBB = Drawing.bBox(el.node());
799
836
var elRadius = Math . sqrt ( ( textBB . width / 2 ) * ( textBB . width / 2 ) + textBB . height * textBB . height ) ;
800
837
var ratio = radius / elRadius ;
801
838
return [ ratio , textBB , radius ] ;
802
839
}
803
840
841
+ function measureText ( txt , font , textAnchor ) {
842
+ var element = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'text' ) ;
843
+ var sel = d3 . select ( element ) ;
844
+ sel . text ( txt )
845
+ . attr ( 'x' , 0 )
846
+ . attr ( 'y' , 0 )
847
+ . attr ( 'text-anchor' , textAnchor )
848
+ . attr ( 'data-unformatted' , txt )
849
+ . call ( Drawing . font , font ) ;
850
+ return Drawing . bBox ( sel . node ( ) ) ;
851
+ }
852
+
804
853
function cache ( trace , name , initialValue , value , key , fn ) {
805
854
var objName = '_cache' + name ;
806
855
if ( ! ( trace [ objName ] && trace [ objName ] . key === key ) ) {
0 commit comments