Skip to content

Commit 9e63c04

Browse files
committed
implement ticklabelposition for cartesian axes
1 parent fa07cc5 commit 9e63c04

File tree

9 files changed

+307
-58
lines changed

9 files changed

+307
-58
lines changed

src/components/colorbar/draw.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,7 @@ function mockColorBarAxis(gd, opts, zrange) {
710710
noHover: true,
711711
noTickson: true,
712712
noTicklabelmode: true,
713+
noTicklabelposition: true,
713714
calendar: fullLayout.calendar // not really necessary (yet?)
714715
};
715716

src/plots/cartesian/autorange.js

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ function getAutoRange(gd, ax) {
5454
var i, j;
5555
var newRange = [];
5656

57-
var getPad = makePadFn(ax);
57+
var getPadMin = makePadFn(ax, 0);
58+
var getPadMax = makePadFn(ax, 1);
5859
var extremes = concatExtremes(gd, ax);
5960
var minArray = extremes.min;
6061
var maxArray = extremes.max;
@@ -104,7 +105,7 @@ function getAutoRange(gd, ax) {
104105
maxpt = maxArray[j];
105106
dv = maxpt.val - minpt.val - calcBreaksLength(ax, minpt.val, maxpt.val);
106107
if(dv > 0) {
107-
dp = axLen - getPad(minpt) - getPad(maxpt);
108+
dp = axLen - getPadMin(minpt) - getPadMax(maxpt);
108109
if(dp > minSpan) {
109110
if(dv / dp > mbest) {
110111
minbest = minpt;
@@ -122,8 +123,8 @@ function getAutoRange(gd, ax) {
122123
}
123124
}
124125

125-
function getMaxPad(prev, pt) {
126-
return Math.max(prev, getPad(pt));
126+
function maximumPad(prev, pt) {
127+
return Math.max(prev, getPadMax(pt));
127128
}
128129

129130
if(minmin === maxmax) {
@@ -137,7 +138,7 @@ function getAutoRange(gd, ax) {
137138
// 'tozero' pins 0 to the low end, so follow that.
138139
newRange = [0, 1];
139140
} else {
140-
var maxPad = (minmin > 0 ? maxArray : minArray).reduce(getMaxPad, 0);
141+
var maxPad = (minmin > 0 ? maxArray : minArray).reduce(maximumPad, 0);
141142
// we're pushing a single value away from the edge due to its
142143
// padding, with the other end clamped at zero
143144
// 0.5 means don't push it farther than the center.
@@ -158,7 +159,7 @@ function getAutoRange(gd, ax) {
158159
maxbest = {val: 0, pad: 0};
159160
}
160161
} else if(nonNegative) {
161-
if(minbest.val - mbest * getPad(minbest) < 0) {
162+
if(minbest.val - mbest * getPadMin(minbest) < 0) {
162163
minbest = {val: 0, pad: 0};
163164
}
164165
if(maxbest.val <= 0) {
@@ -168,11 +169,11 @@ function getAutoRange(gd, ax) {
168169

169170
// in case it changed again...
170171
mbest = (maxbest.val - minbest.val - calcBreaksLength(ax, minpt.val, maxpt.val)) /
171-
(axLen - getPad(minbest) - getPad(maxbest));
172+
(axLen - getPadMin(minbest) - getPadMax(maxbest));
172173

173174
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)
176177
];
177178
}
178179

@@ -199,9 +200,41 @@ function calcBreaksLength(ax, v0, v1) {
199200
* calculate the pixel padding for ax._min and ax._max entries with
200201
* optional extrapad as 5% of the total axis length
201202
*/
202-
function makePadFn(ax) {
203+
function makePadFn(ax, max) {
203204
// 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+
}
205238

206239
// domain-constrained axes: base extrappad on the unconstrained
207240
// domain so it's consistent as the domain changes
@@ -210,7 +243,11 @@ function makePadFn(ax) {
210243
(ax.domain[1] - ax.domain[0]);
211244
}
212245

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+
}
214251
}
215252

216253
function concatExtremes(gd, ax) {

0 commit comments

Comments
 (0)