@@ -110,91 +110,106 @@ axes.minDtick = function(ax,newDiff,newFirst,allow) {
110110 }
111111} ;
112112
113- axes . doAutoRange = function ( ax ) {
114- if ( ! ax . _length ) ax . setScale ( ) ;
113+ axes . getAutoRange = function ( ax ) {
114+ var newRange = [ ] ;
115115
116- if ( ax . autorange && ax . _min && ax . _max &&
117- ax . _min . length && ax . _max . length ) {
118- var minmin = ax . _min [ 0 ] . val ,
119- maxmax = ax . _max [ 0 ] . val ,
120- i ;
121-
122- for ( i = 1 ; i < ax . _min . length ; i ++ ) {
123- if ( minmin !== maxmax ) break ;
124- minmin = Math . min ( minmin , ax . _min [ i ] . val ) ;
125- }
126- for ( i = 1 ; i < ax . _max . length ; i ++ ) {
127- if ( minmin !== maxmax ) break ;
128- maxmax = Math . max ( maxmax , ax . _max [ i ] . val ) ;
129- }
130-
131- var j , minpt , maxpt , minbest , maxbest , dp , dv ,
132- mbest = 0 ,
133- axReverse = ( ax . range && ax . range [ 1 ] < ax . range [ 0 ] ) ;
134- // one-time setting to easily reverse the axis
135- // when plotting from code
136- if ( ax . autorange === 'reversed' ) {
137- axReverse = true ;
138- ax . autorange = true ;
139- }
140- for ( i = 0 ; i < ax . _min . length ; i ++ ) {
141- minpt = ax . _min [ i ] ;
142- for ( j = 0 ; j < ax . _max . length ; j ++ ) {
143- maxpt = ax . _max [ j ] ;
144- dv = maxpt . val - minpt . val ;
145- dp = ax . _length - minpt . pad - maxpt . pad ;
146- if ( dv > 0 && dp > 0 && dv / dp > mbest ) {
147- minbest = minpt ;
148- maxbest = maxpt ;
149- mbest = dv / dp ;
150- }
116+ var minmin = ax . _min [ 0 ] . val ,
117+ maxmax = ax . _max [ 0 ] . val ,
118+ i ;
119+
120+ for ( i = 1 ; i < ax . _min . length ; i ++ ) {
121+ if ( minmin !== maxmax ) break ;
122+ minmin = Math . min ( minmin , ax . _min [ i ] . val ) ;
123+ }
124+ for ( i = 1 ; i < ax . _max . length ; i ++ ) {
125+ if ( minmin !== maxmax ) break ;
126+ maxmax = Math . max ( maxmax , ax . _max [ i ] . val ) ;
127+ }
128+
129+ var j , minpt , maxpt , minbest , maxbest , dp , dv ,
130+ mbest = 0 ,
131+ axReverse = ( ax . range && ax . range [ 1 ] < ax . range [ 0 ] ) ;
132+
133+ // one-time setting to easily reverse the axis
134+ // when plotting from code
135+ if ( ax . autorange === 'reversed' ) {
136+ axReverse = true ;
137+ ax . autorange = true ;
138+ }
139+
140+ for ( i = 0 ; i < ax . _min . length ; i ++ ) {
141+ minpt = ax . _min [ i ] ;
142+ for ( j = 0 ; j < ax . _max . length ; j ++ ) {
143+ maxpt = ax . _max [ j ] ;
144+ dv = maxpt . val - minpt . val ;
145+ dp = ax . _length - minpt . pad - maxpt . pad ;
146+ if ( dv > 0 && dp > 0 && dv / dp > mbest ) {
147+ minbest = minpt ;
148+ maxbest = maxpt ;
149+ mbest = dv / dp ;
151150 }
152151 }
153- if ( minmin === maxmax ) {
154- ax . range = axReverse ?
155- [ minmin + 1 , ax . rangemode !== 'normal' ? 0 : minmin - 1 ] :
156- [ ax . rangemode !== 'normal' ? 0 : minmin - 1 , minmin + 1 ] ;
157- }
158- else if ( mbest ) {
159- if ( ax . type === 'linear' || ax . type === '-' ) {
160- if ( ax . rangemode === 'tozero' && minbest . val >= 0 ) {
152+ }
153+
154+ if ( minmin === maxmax ) {
155+ newRange = axReverse ?
156+ [ minmin + 1 , ax . rangemode !== 'normal' ? 0 : minmin - 1 ] :
157+ [ ax . rangemode !== 'normal' ? 0 : minmin - 1 , minmin + 1 ] ;
158+ }
159+ else if ( mbest ) {
160+ if ( ax . type === 'linear' || ax . type === '-' ) {
161+ if ( ax . rangemode === 'tozero' && minbest . val >= 0 ) {
162+ minbest = { val : 0 , pad : 0 } ;
163+ }
164+ else if ( ax . rangemode === 'nonnegative' ) {
165+ if ( minbest . val - mbest * minbest . pad < 0 ) {
161166 minbest = { val : 0 , pad : 0 } ;
162167 }
163- else if ( ax . rangemode === 'nonnegative' ) {
164- if ( minbest . val - mbest * minbest . pad < 0 ) {
165- minbest = { val : 0 , pad : 0 } ;
166- }
167- if ( maxbest . val < 0 ) {
168- maxbest = { val : 1 , pad : 0 } ;
169- }
168+ if ( maxbest . val < 0 ) {
169+ maxbest = { val : 1 , pad : 0 } ;
170170 }
171-
172- // in case it changed again...
173- mbest = ( maxbest . val - minbest . val ) /
174- ( ax . _length - minbest . pad - maxbest . pad ) ;
175171 }
176172
177- ax . range = [
178- minbest . val - mbest * minbest . pad ,
179- maxbest . val + mbest * maxbest . pad
180- ] ;
173+ // in case it changed again...
174+ mbest = ( maxbest . val - minbest . val ) /
175+ ( ax . _length - minbest . pad - maxbest . pad ) ;
176+ }
181177
182- // don't let axis have zero size
183- if ( ax . range [ 0 ] === ax . range [ 1 ] ) {
184- ax . range = [ ax . range [ 0 ] - 1 , ax . range [ 0 ] + 1 ] ;
185- }
178+ newRange = [
179+ minbest . val - mbest * minbest . pad ,
180+ maxbest . val + mbest * maxbest . pad
181+ ] ;
186182
187- // maintain reversal
188- if ( axReverse ) {
189- ax . range . reverse ( ) ;
190- }
183+ // don't let axis have zero size
184+ if ( newRange [ 0 ] === newRange [ 1 ] ) {
185+ newRange = [ newRange [ 0 ] - 1 , newRange [ 0 ] + 1 ] ;
191186 }
192187
188+ // maintain reversal
189+ if ( axReverse ) {
190+ newRange . reverse ( ) ;
191+ }
192+ }
193+
194+ return newRange ;
195+ } ;
196+
197+ axes . doAutoRange = function ( ax ) {
198+ if ( ! ax . _length ) ax . setScale ( ) ;
199+
200+ // TODO do we really need this?
201+ var hasDeps = ( ax . _min && ax . _max && ax . _min . length && ax . _max . length ) ;
202+
203+ if ( ax . autorange && hasDeps ) {
204+ ax . range = axes . getAutoRange ( ax ) ;
205+
193206 // doAutoRange will get called on fullLayout,
194207 // but we want to report its results back to layout
195208 var axIn = ax . _gd . layout [ ax . _name ] ;
209+
196210 if ( ! axIn ) ax . _gd . layout [ ax . _name ] = axIn = { } ;
197- if ( axIn !== ax ) {
211+
212+ if ( axIn !== ax ) {
198213 axIn . range = ax . range . slice ( ) ;
199214 axIn . autorange = ax . autorange ;
200215 }
@@ -241,7 +256,8 @@ axes.saveRangeInitial = function(gd, overwrite) {
241256// and make it a tight bound if possible
242257var FP_SAFE = Number . MAX_VALUE / 2 ;
243258axes . expand = function ( ax , data , options ) {
244- if ( ! ax . autorange || ! data ) return ;
259+ // if(!(ax.autorange || (ax.rangeslider || {}).visible) || !data) return;
260+ if ( ! ( ax . autorange || ax . _needsExpand ) || ! data ) return ;
245261 if ( ! ax . _min ) ax . _min = [ ] ;
246262 if ( ! ax . _max ) ax . _max = [ ] ;
247263 if ( ! options ) options = { } ;
0 commit comments