@@ -172,14 +172,27 @@ axes.getAutoRange = function(ax) {
172172 }
173173
174174 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+ }
178186 }
179187 else if ( mbest ) {
180188 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+ }
183196 }
184197 else if ( ax . rangemode === 'nonnegative' ) {
185198 if ( minbest . val - mbest * minbest . pad < 0 ) {
@@ -193,22 +206,39 @@ axes.getAutoRange = function(ax) {
193206 // in case it changed again...
194207 mbest = ( maxbest . val - minbest . val ) /
195208 ( ax . _length - minbest . pad - maxbest . pad ) ;
209+
196210 }
197211
198212 newRange = [
199213 minbest . val - mbest * minbest . pad ,
200214 maxbest . val + mbest * maxbest . pad
201215 ] ;
216+ }
202217
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 {
205232 newRange = [ newRange [ 0 ] - 1 , newRange [ 0 ] + 1 ] ;
233+ if ( ax . rangemode === 'nonnegative' ) {
234+ newRange [ 0 ] = Math . max ( 0 , newRange [ 0 ] ) ;
235+ }
206236 }
237+ }
207238
208- // maintain reversal
209- if ( axReverse ) {
210- newRange . reverse ( ) ;
211- }
239+ // maintain reversal
240+ if ( axReverse ) {
241+ newRange . reverse ( ) ;
212242 }
213243
214244 return newRange ;
0 commit comments