@@ -84,7 +84,8 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, traces) {
84
84
85
85
// set bar bases and sizes, and update size axis
86
86
if ( barnorm ) {
87
- stackBars ( gd , sa , sieve ) ;
87
+ sieveBars ( gd , sa , sieve ) ;
88
+ normalizeBars ( gd , sa , sieve ) ;
88
89
}
89
90
else {
90
91
// make sure the size axis includes zero,
@@ -113,7 +114,8 @@ function setGroupPositionsInGroupMode(gd, pa, sa, traces) {
113
114
114
115
// set bar bases and sizes, and update size axis
115
116
if ( barnorm ) {
116
- stackBars ( gd , sa , sieve ) ;
117
+ sieveBars ( gd , sa , sieve ) ;
118
+ normalizeBars ( gd , sa , sieve ) ;
117
119
}
118
120
else {
119
121
// make sure the size axis includes zero,
@@ -231,6 +233,9 @@ function setOffsetAndWidthInGroupMode(gd, pa, sieve) {
231
233
}
232
234
}
233
235
236
+ // stack bars that only differ by rounding
237
+ sieve . binWidth = traces [ 0 ] [ 0 ] . t . barwidth / 100 ;
238
+
234
239
// update position axes
235
240
Axes . minDtick ( pa , minDiff , distinctPositions [ 0 ] , overlap ) ;
236
241
Axes . expand ( pa , distinctPositions , { vpad : minDiff / 2 } ) ;
@@ -239,15 +244,12 @@ function setOffsetAndWidthInGroupMode(gd, pa, sieve) {
239
244
240
245
function stackBars ( gd , sa , sieve ) {
241
246
var fullLayout = gd . _fullLayout ,
247
+ barnorm = fullLayout . barnorm ,
242
248
sLetter = getAxisLetter ( sa ) ,
243
249
traces = sieve . traces ,
244
250
i , trace ,
245
251
j , bar ;
246
252
247
- var stack = ( fullLayout . barmode === 'stack' ) ,
248
- relative = ( fullLayout . barmode === 'relative' ) ,
249
- norm = fullLayout . barnorm ;
250
-
251
253
// bar size range and stacking calculation
252
254
// for stacked bars, we need to evaluate every step in every
253
255
// stack, because negative bars mean the extremes could be
@@ -257,37 +259,32 @@ function stackBars(gd, sa, sieve) {
257
259
var sMax = sa . l2c ( sa . c2l ( 0 ) ) ,
258
260
sMin = sMax ;
259
261
260
- // stack bars that only differ by rounding
261
- sieve . binWidth = traces [ 0 ] [ 0 ] . t . barwidth / 100 ;
262
-
263
262
for ( i = 0 ; i < traces . length ; i ++ ) {
264
263
trace = traces [ i ] ;
265
264
266
265
for ( j = 0 ; j < trace . length ; j ++ ) {
267
266
bar = trace [ j ] ;
268
267
269
- // skip over bars with no size,
270
- // so that we don't try to stack them
271
268
if ( ! isNumeric ( bar . s ) ) continue ;
272
269
273
270
// stack current bar and get previous sum
274
271
var previousSum = sieve . put ( bar . p , bar . s ) ;
275
272
276
- if ( stack || relative ) bar . b = previousSum ;
273
+ // store the bar base and top in each calcdata item
274
+ bar . b = previousSum ;
277
275
278
- // store the bar top in each calcdata item
279
- if ( stack || relative ) {
280
- var barEnd = bar . b + bar . s ;
281
- bar [ sLetter ] = barEnd ;
282
- if ( ! norm && isNumeric ( sa . c2l ( barEnd ) ) ) {
283
- sMax = Math . max ( sMax , barEnd ) ;
284
- sMin = Math . min ( sMin , barEnd ) ;
285
- }
276
+ var barEnd = bar . b + bar . s ;
277
+ bar [ sLetter ] = barEnd ;
278
+
279
+ if ( ! barnorm && isNumeric ( sa . c2l ( barEnd ) ) ) {
280
+ sMax = Math . max ( sMax , barEnd ) ;
281
+ sMin = Math . min ( sMin , barEnd ) ;
286
282
}
287
283
}
288
284
}
289
285
290
- if ( norm ) {
286
+ // if barnorm is set, let normalizeBars update the axis range
287
+ if ( barnorm ) {
291
288
normalizeBars ( gd , sa , sieve ) ;
292
289
}
293
290
else {
@@ -296,7 +293,27 @@ function stackBars(gd, sa, sieve) {
296
293
}
297
294
298
295
296
+ function sieveBars ( gd , sa , sieve ) {
297
+ var traces = sieve . traces ;
298
+
299
+ for ( var i = 0 ; i < traces . length ; i ++ ) {
300
+ var trace = traces [ i ] ;
301
+
302
+ for ( var j = 0 ; j < trace . length ; j ++ ) {
303
+ var bar = trace [ j ] ;
304
+
305
+ if ( isNumeric ( bar . s ) ) sieve . put ( bar . p , bar . s ) ;
306
+ }
307
+ }
308
+ }
309
+
310
+
299
311
function normalizeBars ( gd , sa , sieve ) {
312
+ // Note:
313
+ //
314
+ // normalizeBars requires that either sieveBars or stackBars has been
315
+ // previously invoked.
316
+
300
317
var traces = sieve . traces ,
301
318
sLetter = getAxisLetter ( sa ) ,
302
319
sTop = ( gd . _fullLayout . barnorm === 'fraction' ) ? 1 : 100 ,
@@ -332,6 +349,7 @@ function normalizeBars(gd, sa, sieve) {
332
349
}
333
350
}
334
351
352
+ // update range of size axis
335
353
Axes . expand ( sa , [ sMin , sMax ] , { tozero : true , padded : padded } ) ;
336
354
}
337
355
0 commit comments