@@ -74,7 +74,6 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb
7474 var centerX = size . l + size . w / 2 ;
7575 var centerY = size . t + size . h / 2 ;
7676
77-
7877 // Angular gauge size
7978 var radius = Math . min ( size . w / 2 , size . h ) ; // fill domain
8079 var innerRadius = cn . innerRadius * radius ;
@@ -519,59 +518,31 @@ function drawNumbers(gd, plotGroup, cd, opts) {
519518 var trace = cd [ 0 ] . trace ;
520519 var numbersX = opts . numbersX ;
521520 var numbersY = opts . numbersY ;
522- var numbersAnchor = anchor [ trace . align || 'center' ] ;
521+ var numbersAlign = trace . align || 'center' ;
522+ var numbersAnchor = anchor [ numbersAlign ] ;
523523
524524 var hasTransition = opts . hasTransition ;
525525 var transitionOpts = opts . transitionOpts ;
526526 var onComplete = opts . onComplete ;
527527
528- var bignumberFontSize , deltaFontSize ;
529- if ( trace . _hasNumber ) bignumberFontSize = trace . number . font . size ;
530- if ( trace . _hasDelta ) deltaFontSize = trace . delta . font . size ;
531-
532- // Position delta relative to bignumber
533- var deltaDy = 0 ;
534- var deltaX = 0 ;
535- var bignumberY = 0 ;
536-
537- if ( trace . _hasDelta && trace . _hasNumber ) {
538- if ( trace . delta . position === 'bottom' ) {
539- deltaDy = deltaFontSize * 1.5 ;
540- }
541- if ( trace . delta . position === 'top' ) {
542- deltaDy = - bignumberFontSize + MID_SHIFT * deltaFontSize ;
543- }
544- if ( trace . delta . position === 'right' ) {
545- deltaX = undefined ;
546- }
547- if ( trace . delta . position === 'left' ) {
548- deltaX = undefined ;
549- bignumberY = MID_SHIFT * bignumberFontSize / 2 ;
550- }
551- }
552- deltaDy -= MID_SHIFT * deltaFontSize ;
553-
554- var numbers = Lib . ensureSingle ( plotGroup , 'text' , 'numbers' ) ;
528+ var numbers = Lib . ensureSingle ( plotGroup , 'g' , 'numbers' ) ;
529+ var bignumberbBox , deltabBox ;
555530
556531 var data = [ ] ;
557532 if ( trace . _hasNumber ) data . push ( 'number' ) ;
558533 if ( trace . _hasDelta ) {
559534 data . push ( 'delta' ) ;
560535 if ( trace . delta . position === 'left' ) data . reverse ( ) ;
561536 }
562- var sel = numbers . selectAll ( 'tspan ' ) . data ( data ) ;
563- sel . enter ( ) . append ( 'tspan ' ) ;
537+ var sel = numbers . selectAll ( 'text ' ) . data ( data ) ;
538+ sel . enter ( ) . append ( 'text ' ) ;
564539 sel
565540 . attr ( 'text-anchor' , function ( ) { return numbersAnchor ; } )
566541 . attr ( 'class' , function ( d ) { return d ; } )
567- . attr ( 'dx' , function ( d , i ) {
568- // Add padding to the second tspan when it's a one-liner
569- if ( i === 1 ) {
570- var pos = trace . delta . position ;
571- if ( pos === 'left' || pos === 'right' ) return 10 ;
572- }
573- return null ;
574- } ) ;
542+ . attr ( 'x' , null )
543+ . attr ( 'y' , null )
544+ . attr ( 'dx' , null )
545+ . attr ( 'dy' , null ) ;
575546 sel . exit ( ) . remove ( ) ;
576547
577548 function drawBignumber ( ) {
@@ -581,11 +552,9 @@ function drawNumbers(gd, plotGroup, cd, opts) {
581552 var bignumberSuffix = trace . number . suffix ;
582553 var bignumberPrefix = trace . number . prefix ;
583554
584- var number = numbers . select ( 'tspan .number' ) ;
555+ var number = numbers . select ( 'text .number' ) ;
585556 number
586- . call ( Drawing . font , trace . number . font )
587- . attr ( 'x' , null )
588- . attr ( 'dy' , bignumberY ) ;
557+ . call ( Drawing . font , trace . number . font ) ;
589558
590559 if ( hasTransition ) {
591560 number
@@ -604,6 +573,11 @@ function drawNumbers(gd, plotGroup, cd, opts) {
604573 } else {
605574 number . text ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
606575 }
576+
577+ number . attr ( 'data-unformatted' , bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
578+ bignumberbBox = Drawing . bBox ( number . node ( ) ) ;
579+
580+ return number ;
607581 }
608582
609583 function drawDelta ( ) {
@@ -622,12 +596,10 @@ function drawNumbers(gd, plotGroup, cd, opts) {
622596 var deltaFill = function ( d ) {
623597 return d . delta >= 0 ? trace . delta . increasing . color : trace . delta . decreasing . color ;
624598 } ;
625- var delta = numbers . select ( 'tspan .delta' ) ;
599+ var delta = numbers . select ( 'text .delta' ) ;
626600 delta
627601 . call ( Drawing . font , trace . delta . font )
628- . call ( Color . fill , deltaFill ( cd [ 0 ] ) )
629- . attr ( 'x' , deltaX )
630- . attr ( 'dy' , deltaDy ) ;
602+ . call ( Color . fill , deltaFill ( cd [ 0 ] ) ) ;
631603
632604 if ( hasTransition ) {
633605 delta
@@ -650,11 +622,46 @@ function drawNumbers(gd, plotGroup, cd, opts) {
650622 return deltaFormatText ( deltaValue ( cd [ 0 ] ) ) ;
651623 } ) ;
652624 }
625+
626+ delta . attr ( 'data-unformatted' , deltaFormatText ( deltaValue ( cd [ 0 ] ) ) ) ;
627+ deltabBox = Drawing . bBox ( delta . node ( ) ) ;
628+
629+ return delta ;
653630 }
654631
655- if ( trace . _hasDelta ) drawDelta ( ) ;
632+ // Position delta relative to bignumber
633+ var delta ;
634+ if ( trace . _hasDelta ) delta = drawDelta ( ) ;
656635 if ( trace . _hasNumber ) drawBignumber ( ) ;
657636
637+ if ( trace . _hasDelta && trace . _hasNumber ) {
638+ var bignumberCenter = [
639+ ( bignumberbBox . left + bignumberbBox . right ) / 2 ,
640+ ( bignumberbBox . top + bignumberbBox . bottom ) / 2
641+ ] ;
642+ var deltaCenter = [
643+ ( deltabBox . left + deltabBox . right ) / 2 ,
644+ ( deltabBox . top + deltabBox . bottom ) / 2
645+ ] ;
646+
647+ if ( trace . delta . position === 'left' ) {
648+ delta . attr ( 'dx' , bignumberbBox . left - deltabBox . right - cn . horizontalPadding ) ;
649+ delta . attr ( 'dy' , bignumberCenter [ 1 ] - deltaCenter [ 1 ] ) ;
650+ }
651+ if ( trace . delta . position === 'right' ) {
652+ delta . attr ( 'dx' , bignumberbBox . right - deltabBox . left + cn . horizontalPadding ) ;
653+ delta . attr ( 'dy' , bignumberCenter [ 1 ] - deltaCenter [ 1 ] ) ;
654+ }
655+ if ( trace . delta . position === 'bottom' ) {
656+ delta . attr ( 'dx' , null ) ;
657+ delta . attr ( 'dy' , deltabBox . height ) ;
658+ }
659+ if ( trace . delta . position === 'top' ) {
660+ delta . attr ( 'dx' , null ) ;
661+ delta . attr ( 'dy' , bignumberbBox . top ) ;
662+ }
663+ }
664+
658665 // Resize numbers to fit within space and position
659666 numbers . attr ( 'transform' , function ( ) {
660667 var m = opts . numbersScaler ( numbers ) ;
@@ -677,7 +684,10 @@ function drawNumbers(gd, plotGroup, cd, opts) {
677684 // Stash the top position of numbersbBox for title positioning
678685 trace . _numbersTop = scaleRatio * ( numbersbBox . top ) + translateY ;
679686
680- return strTranslate ( numbersX , translateY ) + ' scale(' + scaleRatio + ')' ;
687+ var ref = numbersbBox [ numbersAlign ] ;
688+ if ( numbersAlign === 'center' ) ref = ( numbersbBox . left + numbersbBox . right ) / 2 ;
689+ var translateX = numbersX - scaleRatio * ref ;
690+ return strTranslate ( translateX , translateY ) + ' scale(' + scaleRatio + ')' ;
681691 } ) ;
682692}
683693
0 commit comments