@@ -54,7 +54,8 @@ function getAutoRange(gd, ax) {
54
54
var i , j ;
55
55
var newRange = [ ] ;
56
56
57
- var getPad = makePadFn ( ax ) ;
57
+ var getPadMin = makePadFn ( ax , 0 ) ;
58
+ var getPadMax = makePadFn ( ax , 1 ) ;
58
59
var extremes = concatExtremes ( gd , ax ) ;
59
60
var minArray = extremes . min ;
60
61
var maxArray = extremes . max ;
@@ -104,7 +105,7 @@ function getAutoRange(gd, ax) {
104
105
maxpt = maxArray [ j ] ;
105
106
dv = maxpt . val - minpt . val - calcBreaksLength ( ax , minpt . val , maxpt . val ) ;
106
107
if ( dv > 0 ) {
107
- dp = axLen - getPad ( minpt ) - getPad ( maxpt ) ;
108
+ dp = axLen - getPadMin ( minpt ) - getPadMax ( maxpt ) ;
108
109
if ( dp > minSpan ) {
109
110
if ( dv / dp > mbest ) {
110
111
minbest = minpt ;
@@ -122,8 +123,8 @@ function getAutoRange(gd, ax) {
122
123
}
123
124
}
124
125
125
- function getMaxPad ( prev , pt ) {
126
- return Math . max ( prev , getPad ( pt ) ) ;
126
+ function maximumPad ( prev , pt ) {
127
+ return Math . max ( prev , getPadMax ( pt ) ) ;
127
128
}
128
129
129
130
if ( minmin === maxmax ) {
@@ -137,7 +138,7 @@ function getAutoRange(gd, ax) {
137
138
// 'tozero' pins 0 to the low end, so follow that.
138
139
newRange = [ 0 , 1 ] ;
139
140
} else {
140
- var maxPad = ( minmin > 0 ? maxArray : minArray ) . reduce ( getMaxPad , 0 ) ;
141
+ var maxPad = ( minmin > 0 ? maxArray : minArray ) . reduce ( maximumPad , 0 ) ;
141
142
// we're pushing a single value away from the edge due to its
142
143
// padding, with the other end clamped at zero
143
144
// 0.5 means don't push it farther than the center.
@@ -158,7 +159,7 @@ function getAutoRange(gd, ax) {
158
159
maxbest = { val : 0 , pad : 0 } ;
159
160
}
160
161
} else if ( nonNegative ) {
161
- if ( minbest . val - mbest * getPad ( minbest ) < 0 ) {
162
+ if ( minbest . val - mbest * getPadMin ( minbest ) < 0 ) {
162
163
minbest = { val : 0 , pad : 0 } ;
163
164
}
164
165
if ( maxbest . val <= 0 ) {
@@ -168,11 +169,11 @@ function getAutoRange(gd, ax) {
168
169
169
170
// in case it changed again...
170
171
mbest = ( maxbest . val - minbest . val - calcBreaksLength ( ax , minpt . val , maxpt . val ) ) /
171
- ( axLen - getPad ( minbest ) - getPad ( maxbest ) ) ;
172
+ ( axLen - getPadMin ( minbest ) - getPadMax ( maxbest ) ) ;
172
173
173
174
newRange = [
174
- minbest . val - mbest * getPad ( minbest ) ,
175
- maxbest . val + mbest * getPad ( maxbest )
175
+ minbest . val - mbest * getPadMin ( minbest ) ,
176
+ maxbest . val + mbest * getPadMax ( maxbest )
176
177
] ;
177
178
}
178
179
@@ -199,9 +200,41 @@ function calcBreaksLength(ax, v0, v1) {
199
200
* calculate the pixel padding for ax._min and ax._max entries with
200
201
* optional extrapad as 5% of the total axis length
201
202
*/
202
- function makePadFn ( ax ) {
203
+ function makePadFn ( ax , max ) {
203
204
// 5% padding for points that specify extrapad: true
204
- var extrappad = ax . _length / 20 ;
205
+ var extrappad = 0.05 * ax . _length ;
206
+
207
+ var anchorAxis = ( ax . _anchorAxis || { } ) ;
208
+ if ( ( anchorAxis . ticklabelposition || '' ) . indexOf ( 'inside' ) !== - 1 ) {
209
+ var axReverse = ax . autorange === 'reversed' ;
210
+ if ( ! axReverse ) {
211
+ var rng = Lib . simpleMap ( ax . range , ax . r2l ) ;
212
+ axReverse = rng [ 1 ] < rng [ 0 ] ;
213
+ }
214
+ if ( axReverse ) max = ! max ;
215
+
216
+ // increase padding to make more room for inside tick labels of the counter axis
217
+ if ( (
218
+ ! max && (
219
+ anchorAxis . side === 'left' ||
220
+ anchorAxis . side === 'bottom'
221
+ )
222
+ ) || (
223
+ max && (
224
+ anchorAxis . side === 'top' ||
225
+ anchorAxis . side === 'right'
226
+ )
227
+ ) ) {
228
+ var fontSize = anchorAxis . tickfont ? anchorAxis . tickfont . size : 12 ;
229
+ var newPad = fontSize * ( ax . _id . charAt ( 0 ) === 'x' ? 4 : 1 ) ;
230
+
231
+ if ( anchorAxis . ticks === 'inside' && anchorAxis . ticklabelposition === 'inside' ) {
232
+ newPad += anchorAxis . ticklen || 0 ;
233
+ }
234
+
235
+ extrappad = Math . max ( extrappad , newPad ) ;
236
+ }
237
+ }
205
238
206
239
// domain-constrained axes: base extrappad on the unconstrained
207
240
// domain so it's consistent as the domain changes
@@ -210,7 +243,11 @@ function makePadFn(ax) {
210
243
( ax . domain [ 1 ] - ax . domain [ 0 ] ) ;
211
244
}
212
245
213
- return function getPad ( pt ) { return pt . pad + ( pt . extrapad ? extrappad : 0 ) ; } ;
246
+ if ( max ) {
247
+ return function getPadMax ( pt ) { return pt . pad + ( pt . extrapad ? extrappad : 0 ) ; } ;
248
+ } else {
249
+ return function getPadMin ( pt ) { return pt . pad + ( pt . extrapad ? extrappad : 0 ) ; } ;
250
+ }
214
251
}
215
252
216
253
function concatExtremes ( gd , ax ) {
0 commit comments