@@ -172,14 +172,27 @@ axes.getAutoRange = function(ax) {
172
172
}
173
173
174
174
if ( minmin === maxmax ) {
175
- newRange = axReverse ?
176
- [ minmin + 1 , ax . rangemode !== 'normal' ? 0 : minmin - 1 ] :
177
- [ ax . rangemode !== 'normal' ? 0 : minmin - 1 , minmin + 1 ] ;
175
+ var lower = minmin - 1 ;
176
+ var upper = minmin + 1 ;
177
+ if ( ax . rangemode === 'tozero' ) {
178
+ newRange = minmin < 0 ? [ lower , 0 ] : [ 0 , upper ] ;
179
+ }
180
+ else if ( ax . rangemode === 'nonnegative' ) {
181
+ newRange = [ Math . max ( 0 , lower ) , Math . max ( 0 , upper ) ] ;
182
+ }
183
+ else {
184
+ newRange = [ lower , upper ] ;
185
+ }
178
186
}
179
187
else if ( mbest ) {
180
188
if ( ax . type === 'linear' || ax . type === '-' ) {
181
- if ( ax . rangemode === 'tozero' && minbest . val >= 0 ) {
182
- minbest = { val : 0 , pad : 0 } ;
189
+ if ( ax . rangemode === 'tozero' ) {
190
+ if ( minbest . val >= 0 ) {
191
+ minbest = { val : 0 , pad : 0 } ;
192
+ }
193
+ if ( maxbest . val <= 0 ) {
194
+ maxbest = { val : 0 , pad : 0 } ;
195
+ }
183
196
}
184
197
else if ( ax . rangemode === 'nonnegative' ) {
185
198
if ( minbest . val - mbest * minbest . pad < 0 ) {
@@ -193,22 +206,39 @@ axes.getAutoRange = function(ax) {
193
206
// in case it changed again...
194
207
mbest = ( maxbest . val - minbest . val ) /
195
208
( ax . _length - minbest . pad - maxbest . pad ) ;
209
+
196
210
}
197
211
198
212
newRange = [
199
213
minbest . val - mbest * minbest . pad ,
200
214
maxbest . val + mbest * maxbest . pad
201
215
] ;
216
+ }
202
217
203
- // don't let axis have zero size
204
- if ( newRange [ 0 ] === newRange [ 1 ] ) {
218
+ // don't let axis have zero size, while still respecting tozero and nonnegative
219
+ if ( newRange [ 0 ] === newRange [ 1 ] ) {
220
+ if ( ax . rangemode === 'tozero' ) {
221
+ if ( newRange [ 0 ] < 0 ) {
222
+ newRange = [ newRange [ 0 ] , 0 ] ;
223
+ }
224
+ else if ( newRange [ 0 ] > 0 ) {
225
+ newRange = [ 0 , newRange [ 0 ] ] ;
226
+ }
227
+ else {
228
+ newRange = [ 0 , 1 ] ;
229
+ }
230
+ }
231
+ else {
205
232
newRange = [ newRange [ 0 ] - 1 , newRange [ 0 ] + 1 ] ;
233
+ if ( ax . rangemode === 'nonnegative' ) {
234
+ newRange [ 0 ] = Math . max ( 0 , newRange [ 0 ] ) ;
235
+ }
206
236
}
237
+ }
207
238
208
- // maintain reversal
209
- if ( axReverse ) {
210
- newRange . reverse ( ) ;
211
- }
239
+ // maintain reversal
240
+ if ( axReverse ) {
241
+ newRange . reverse ( ) ;
212
242
}
213
243
214
244
return newRange ;
0 commit comments