Skip to content

Commit f2a365e

Browse files
committed
bar: ensure size axis includes bar bases
1 parent 19e114e commit f2a365e

File tree

1 file changed

+69
-45
lines changed

1 file changed

+69
-45
lines changed

src/traces/bar/set_positions.js

Lines changed: 69 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,7 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, traces) {
8888
normalizeBars(gd, sa, sieve);
8989
}
9090
else {
91-
// make sure the size axis includes zero,
92-
// along with the tops of each bar,
93-
// and store these bar tops in calcdata
94-
var sLetter = getAxisLetter(sa),
95-
fs = function(v) {
96-
var barTop = v.b + v.s;
97-
v[sLetter] = barTop;
98-
return barTop;
99-
};
100-
101-
Axes.expand(sa, trace.map(fs), {tozero: true, padded: true});
91+
setBaseAndTop(gd, sa, sieve);
10292
}
10393
});
10494
}
@@ -122,19 +112,7 @@ function setGroupPositionsInGroupMode(gd, pa, sa, traces) {
122112
normalizeBars(gd, sa, sieve);
123113
}
124114
else {
125-
// make sure the size axis includes zero,
126-
// along with the tops of each bar,
127-
// and store these bar tops in calcdata
128-
var sLetter = getAxisLetter(sa),
129-
fs = function(v) {
130-
var barTop = v.b + v.s;
131-
v[sLetter] = barTop;
132-
return barTop;
133-
};
134-
135-
for(var i = 0; i < traces.length; i++) {
136-
Axes.expand(sa, traces[i].map(fs), {tozero: true, padded: true});
137-
}
115+
setBaseAndTop(gd, sa, sieve);
138116
}
139117
}
140118

@@ -250,6 +228,40 @@ function setOffsetAndWidthInGroupMode(gd, pa, sieve) {
250228
}
251229

252230

231+
function setBaseAndTop(gd, sa, sieve) {
232+
// store these bar bases and tops in calcdata
233+
// and make sure the size axis includes zero,
234+
// along with the bases and tops of each bar.
235+
var traces = sieve.traces,
236+
sLetter = getAxisLetter(sa),
237+
sMax = sa.l2c(sa.c2l(0)),
238+
sMin = sMax;
239+
240+
for(var i = 0; i < traces.length; i++) {
241+
var trace = traces[i];
242+
243+
for(var j = 0; j < trace.length; j++) {
244+
var bar = trace[j],
245+
barBase = bar.b,
246+
barTop = barBase + bar.s;
247+
248+
bar[sLetter] = barTop;
249+
250+
if(isNumeric(sa.c2l(barTop))) {
251+
sMax = Math.max(sMax, barTop);
252+
sMin = Math.min(sMin, barTop);
253+
}
254+
if(isNumeric(sa.c2l(barBase))) {
255+
sMax = Math.max(sMax, barBase);
256+
sMin = Math.min(sMin, barBase);
257+
}
258+
}
259+
}
260+
261+
Axes.expand(sa, [sMin, sMax], {tozero: true, padded: true});
262+
}
263+
264+
253265
function stackBars(gd, sa, sieve) {
254266
var fullLayout = gd._fullLayout,
255267
barnorm = fullLayout.barnorm,
@@ -258,12 +270,6 @@ function stackBars(gd, sa, sieve) {
258270
i, trace,
259271
j, bar;
260272

261-
// bar size range and stacking calculation
262-
// for stacked bars, we need to evaluate every step in every
263-
// stack, because negative bars mean the extremes could be
264-
// anywhere
265-
// also stores the base (b) of each bar in calcdata
266-
// so we don't have to redo this later
267273
var sMax = sa.l2c(sa.c2l(0)),
268274
sMin = sMax;
269275

@@ -276,17 +282,22 @@ function stackBars(gd, sa, sieve) {
276282
if(!isNumeric(bar.s)) continue;
277283

278284
// stack current bar and get previous sum
279-
var previousSum = sieve.put(bar.p, bar.b + bar.s);
285+
var barBase = sieve.put(bar.p, bar.b + bar.s),
286+
barTop = barBase + bar.s;
280287

281288
// store the bar base and top in each calcdata item
282-
bar.b = previousSum;
289+
bar.b = barBase;
290+
bar[sLetter] = barTop;
283291

284-
var barEnd = bar.b + bar.s;
285-
bar[sLetter] = barEnd;
286-
287-
if(!barnorm && isNumeric(sa.c2l(barEnd))) {
288-
sMax = Math.max(sMax, barEnd);
289-
sMin = Math.min(sMin, barEnd);
292+
if(!barnorm) {
293+
if(isNumeric(sa.c2l(barTop))) {
294+
sMax = Math.max(sMax, barTop);
295+
sMin = Math.min(sMin, barTop);
296+
}
297+
if(isNumeric(sa.c2l(barBase))) {
298+
sMax = Math.max(sMax, barBase);
299+
sMin = Math.min(sMin, barBase);
300+
}
290301
}
291302
}
292303
}
@@ -341,17 +352,30 @@ function normalizeBars(gd, sa, sieve) {
341352
var scale = Math.abs(sTop / sieve.get(bar.p, bar.b + bar.s));
342353
bar.b *= scale;
343354
bar.s *= scale;
344-
var barEnd = bar.b + bar.s;
345-
bar[sLetter] = barEnd;
346355

347-
if(isNumeric(sa.c2l(barEnd))) {
348-
if(barEnd < sMin - sTiny) {
356+
var barBase = bar.b,
357+
barTop = barBase + bar.s;
358+
bar[sLetter] = barTop;
359+
360+
if(isNumeric(sa.c2l(barTop))) {
361+
if(barTop < sMin - sTiny) {
362+
padded = true;
363+
sMin = barTop;
364+
}
365+
if(barTop > sMax + sTiny) {
366+
padded = true;
367+
sMax = barTop;
368+
}
369+
}
370+
371+
if(isNumeric(sa.c2l(barBase))) {
372+
if(barBase < sMin - sTiny) {
349373
padded = true;
350-
sMin = barEnd;
374+
sMin = barBase;
351375
}
352-
if(barEnd > sMax + sTiny) {
376+
if(barBase > sMax + sTiny) {
353377
padded = true;
354-
sMax = barEnd;
378+
sMax = barBase;
355379
}
356380
}
357381
}

0 commit comments

Comments
 (0)