@@ -110,91 +110,106 @@ axes.minDtick = function(ax,newDiff,newFirst,allow) {
110
110
}
111
111
} ;
112
112
113
- axes . doAutoRange = function ( ax ) {
114
- if ( ! ax . _length ) ax . setScale ( ) ;
113
+ axes . getAutoRange = function ( ax ) {
114
+ var newRange = [ ] ;
115
115
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 ;
151
150
}
152
151
}
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 ) {
161
166
minbest = { val : 0 , pad : 0 } ;
162
167
}
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 } ;
170
170
}
171
-
172
- // in case it changed again...
173
- mbest = ( maxbest . val - minbest . val ) /
174
- ( ax . _length - minbest . pad - maxbest . pad ) ;
175
171
}
176
172
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
+ }
181
177
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
+ ] ;
186
182
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 ] ;
191
186
}
192
187
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
+
193
206
// doAutoRange will get called on fullLayout,
194
207
// but we want to report its results back to layout
195
208
var axIn = ax . _gd . layout [ ax . _name ] ;
209
+
196
210
if ( ! axIn ) ax . _gd . layout [ ax . _name ] = axIn = { } ;
197
- if ( axIn !== ax ) {
211
+
212
+ if ( axIn !== ax ) {
198
213
axIn . range = ax . range . slice ( ) ;
199
214
axIn . autorange = ax . autorange ;
200
215
}
@@ -241,7 +256,8 @@ axes.saveRangeInitial = function(gd, overwrite) {
241
256
// and make it a tight bound if possible
242
257
var FP_SAFE = Number . MAX_VALUE / 2 ;
243
258
axes . 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 ;
245
261
if ( ! ax . _min ) ax . _min = [ ] ;
246
262
if ( ! ax . _max ) ax . _max = [ ] ;
247
263
if ( ! options ) options = { } ;
0 commit comments