Skip to content

Commit b18669d

Browse files
committed
make sizeAxis findExtremes calls per-trace
... this way we can 🔪 min/max logic in Bar.crossTraceCalc which is already done during Axes.getAutoRange.
1 parent c14ad69 commit b18669d

File tree

1 file changed

+58
-61
lines changed

1 file changed

+58
-61
lines changed

src/traces/bar/cross_trace_calc.js

+58-61
Original file line numberDiff line numberDiff line change
@@ -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.
474466
function 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

498492
function 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.
553550
function 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

Comments
 (0)