@@ -460,75 +460,72 @@ function updatePositionAxis(gd, pa, sieve, allowMinDtick) {
460460 }
461461}
462462
463- function expandRange ( range , newValue ) {
464- if ( isNumeric ( range [ 0 ] ) ) range [ 0 ] = Math . min ( range [ 0 ] , newValue ) ;
465- else range [ 0 ] = newValue ;
466-
467- if ( isNumeric ( range [ 1 ] ) ) range [ 1 ] = Math . max ( range [ 1 ] , newValue ) ;
468- else range [ 1 ] = newValue ;
469- }
470-
471463// store these bar bases and tops in calcdata
472464// and make sure the size axis includes zero,
473465// along with the bases and tops of each bar.
474466function setBaseAndTop ( gd , sa , sieve ) {
475467 var calcTraces = sieve . traces ;
476468 var sLetter = getAxisLetter ( sa ) ;
477- var sRange = [ null , null ] ;
478469
479470 for ( var i = 0 ; i < calcTraces . length ; i ++ ) {
480471 var calcTrace = calcTraces [ i ] ;
472+ var fullTrace = calcTrace [ 0 ] . trace ;
473+ var pts = [ ] ;
481474
482475 for ( var j = 0 ; j < calcTrace . length ; j ++ ) {
483476 var bar = calcTrace [ j ] ;
484477 var barBase = bar . b ;
485478 var barTop = barBase + bar . s ;
486479
487480 bar [ sLetter ] = barTop ;
488-
489- if ( isNumeric ( sa . c2l ( barTop ) ) ) expandRange ( sRange , barTop ) ;
490- if ( bar . hasB && isNumeric ( sa . c2l ( barBase ) ) ) expandRange ( sRange , barBase ) ;
481+ pts . push ( barTop ) ;
482+ if ( bar . hasB ) pts . push ( barBase ) ;
491483 }
492- }
493484
494- var extremes = Axes . findExtremes ( sa , sRange , { tozero : true , padded : true } ) ;
495- putExtremes ( calcTraces , sa , extremes ) ;
485+ fullTrace . _extremes [ sa . _id ] = Axes . findExtremes ( sa , pts , {
486+ tozero : true ,
487+ padded : true
488+ } ) ;
489+ }
496490}
497491
498492function stackBars ( gd , sa , sieve ) {
499493 var fullLayout = gd . _fullLayout ;
500494 var barnorm = fullLayout . barnorm ;
501495 var sLetter = getAxisLetter ( sa ) ;
502496 var calcTraces = sieve . traces ;
503- var sRange = [ null , null ] ;
504497
505498 for ( var i = 0 ; i < calcTraces . length ; i ++ ) {
506499 var calcTrace = calcTraces [ i ] ;
500+ var fullTrace = calcTrace [ 0 ] . trace ;
501+ var pts = [ ] ;
507502
508503 for ( var j = 0 ; j < calcTrace . length ; j ++ ) {
509504 var bar = calcTrace [ j ] ;
510505
511- if ( bar . s === BADNUM ) continue ;
512-
513- // stack current bar and get previous sum
514- var barBase = sieve . put ( bar . p , bar . b + bar . s ) ;
515- var barTop = barBase + bar . b + bar . s ;
506+ if ( bar . s !== BADNUM ) {
507+ // stack current bar and get previous sum
508+ var barBase = sieve . put ( bar . p , bar . b + bar . s ) ;
509+ var barTop = barBase + bar . b + bar . s ;
516510
517- // store the bar base and top in each calcdata item
518- bar . b = barBase ;
519- bar [ sLetter ] = barTop ;
511+ // store the bar base and top in each calcdata item
512+ bar . b = barBase ;
513+ bar [ sLetter ] = barTop ;
520514
521- if ( ! barnorm ) {
522- if ( isNumeric ( sa . c2l ( barTop ) ) ) expandRange ( sRange , barTop ) ;
523- if ( bar . hasB && isNumeric ( sa . c2l ( barBase ) ) ) expandRange ( sRange , barBase ) ;
515+ if ( ! barnorm ) {
516+ pts . push ( barTop ) ;
517+ if ( bar . hasB ) pts . push ( barBase ) ;
518+ }
524519 }
525520 }
526- }
527521
528- // if barnorm is set, let normalizeBars update the axis range
529- if ( ! barnorm ) {
530- var extremes = Axes . findExtremes ( sa , sRange , { tozero : true , padded : true } ) ;
531- putExtremes ( calcTraces , sa , extremes ) ;
522+ // if barnorm is set, let normalizeBars update the axis range
523+ if ( ! barnorm ) {
524+ fullTrace . _extremes [ sa . _id ] = Axes . findExtremes ( sa , pts , {
525+ tozero : true ,
526+ padded : true
527+ } ) ;
528+ }
532529 }
533530}
534531
@@ -551,53 +548,53 @@ function sieveBars(gd, sa, sieve) {
551548// normalizeBars requires that either sieveBars or stackBars has been
552549// previously invoked.
553550function normalizeBars ( gd , sa , sieve ) {
551+ var fullLayout = gd . _fullLayout ;
554552 var calcTraces = sieve . traces ;
555553 var sLetter = getAxisLetter ( sa ) ;
556- var sTop = ( gd . _fullLayout . barnorm === 'fraction' ) ? 1 : 100 ;
554+ var sTop = fullLayout . barnorm === 'fraction' ? 1 : 100 ;
557555 var sTiny = sTop / 1e9 ; // in case of rounding error in sum
558556 var sMin = sa . l2c ( sa . c2l ( 0 ) ) ;
559- var sMax = ( gd . _fullLayout . barmode === 'stack' ) ? sTop : sMin ;
560- var sRange = [ sMin , sMax ] ;
561- var padded = false ;
557+ var sMax = fullLayout . barmode === 'stack' ? sTop : sMin ;
562558
563- function maybeExpand ( newValue ) {
564- if ( isNumeric ( sa . c2l ( newValue ) ) &&
565- ( ( newValue < sMin - sTiny ) || ( newValue > sMax + sTiny ) || ! isNumeric ( sMin ) )
566- ) {
567- padded = true ;
568- expandRange ( sRange , newValue ) ;
569- }
559+ function needsPadding ( v ) {
560+ return (
561+ isNumeric ( sa . c2l ( v ) ) &&
562+ ( ( v < sMin - sTiny ) || ( v > sMax + sTiny ) || ! isNumeric ( sMin ) )
563+ ) ;
570564 }
571565
572566 for ( var i = 0 ; i < calcTraces . length ; i ++ ) {
573567 var calcTrace = calcTraces [ i ] ;
568+ var fullTrace = calcTrace [ 0 ] . trace ;
569+ var pts = [ ] ;
570+ var padded = false ;
574571
575572 for ( var j = 0 ; j < calcTrace . length ; j ++ ) {
576573 var bar = calcTrace [ j ] ;
577574
578- if ( bar . s === BADNUM ) continue ;
575+ if ( bar . s !== BADNUM ) {
576+ var scale = Math . abs ( sTop / sieve . get ( bar . p , bar . s ) ) ;
577+ bar . b *= scale ;
578+ bar . s *= scale ;
579579
580- var scale = Math . abs ( sTop / sieve . get ( bar . p , bar . s ) ) ;
581- bar . b *= scale ;
582- bar . s *= scale ;
580+ var barBase = bar . b ;
581+ var barTop = barBase + bar . s ;
583582
584- var barBase = bar . b ;
585- var barTop = barBase + bar . s ;
586- bar [ sLetter ] = barTop ;
583+ bar [ sLetter ] = barTop ;
584+ pts . push ( barTop ) ;
585+ padded = padded || needsPadding ( barTop ) ;
587586
588- maybeExpand ( barTop ) ;
589- if ( bar . hasB ) maybeExpand ( barBase ) ;
587+ if ( bar . hasB ) {
588+ pts . push ( barBase ) ;
589+ padded = padded || needsPadding ( barBase ) ;
590+ }
591+ }
590592 }
591- }
592-
593- // update range of size axis
594- var extremes = Axes . findExtremes ( sa , sRange , { tozero : true , padded : padded } ) ;
595- putExtremes ( calcTraces , sa , extremes ) ;
596- }
597593
598- function putExtremes ( cd , ax , extremes ) {
599- for ( var i = 0 ; i < cd . length ; i ++ ) {
600- cd [ i ] [ 0 ] . trace . _extremes [ ax . _id ] = extremes ;
594+ fullTrace . _extremes [ sa . _id ] = Axes . findExtremes ( sa , pts , {
595+ tozero : true ,
596+ padded : padded
597+ } ) ;
601598 }
602599}
603600
0 commit comments