@@ -88,17 +88,7 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, traces) {
88
88
normalizeBars ( gd , sa , sieve ) ;
89
89
}
90
90
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 ) ;
102
92
}
103
93
} ) ;
104
94
}
@@ -122,19 +112,7 @@ function setGroupPositionsInGroupMode(gd, pa, sa, traces) {
122
112
normalizeBars ( gd , sa , sieve ) ;
123
113
}
124
114
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 ) ;
138
116
}
139
117
}
140
118
@@ -250,6 +228,40 @@ function setOffsetAndWidthInGroupMode(gd, pa, sieve) {
250
228
}
251
229
252
230
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
+
253
265
function stackBars ( gd , sa , sieve ) {
254
266
var fullLayout = gd . _fullLayout ,
255
267
barnorm = fullLayout . barnorm ,
@@ -258,12 +270,6 @@ function stackBars(gd, sa, sieve) {
258
270
i , trace ,
259
271
j , bar ;
260
272
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
267
273
var sMax = sa . l2c ( sa . c2l ( 0 ) ) ,
268
274
sMin = sMax ;
269
275
@@ -276,17 +282,22 @@ function stackBars(gd, sa, sieve) {
276
282
if ( ! isNumeric ( bar . s ) ) continue ;
277
283
278
284
// 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 ;
280
287
281
288
// store the bar base and top in each calcdata item
282
- bar . b = previousSum ;
289
+ bar . b = barBase ;
290
+ bar [ sLetter ] = barTop ;
283
291
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
+ }
290
301
}
291
302
}
292
303
}
@@ -341,17 +352,30 @@ function normalizeBars(gd, sa, sieve) {
341
352
var scale = Math . abs ( sTop / sieve . get ( bar . p , bar . b + bar . s ) ) ;
342
353
bar . b *= scale ;
343
354
bar . s *= scale ;
344
- var barEnd = bar . b + bar . s ;
345
- bar [ sLetter ] = barEnd ;
346
355
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 ) {
349
373
padded = true ;
350
- sMin = barEnd ;
374
+ sMin = barBase ;
351
375
}
352
- if ( barEnd > sMax + sTiny ) {
376
+ if ( barBase > sMax + sTiny ) {
353
377
padded = true ;
354
- sMax = barEnd ;
378
+ sMax = barBase ;
355
379
}
356
380
}
357
381
}
0 commit comments