Skip to content

Commit b03faea

Browse files
Moved tickmode sync logic to syncTicks
1 parent 6352d93 commit b03faea

File tree

1 file changed

+56
-31
lines changed

1 file changed

+56
-31
lines changed

src/plots/cartesian/axes.js

Lines changed: 56 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -657,36 +657,8 @@ function isClose(a, b) {
657657
axes.prepTicks = function(ax, opts) {
658658
var rng = Lib.simpleMap(ax.range, ax.r2l, undefined, undefined, opts);
659659

660-
// sync ticks with the overlaying defined axis
661-
if(ax.tickmode === 'sync') {
662-
var baseAxis = ax._mainAxis;
663-
664-
// get range min and max to find range delta of axis 2
665-
var minValAxis = Math.min(ax.range[0], ax.range[1]);
666-
var maxValAxis = Math.max(ax.range[0], ax.range[1]);
667-
var rangeDeltaCurrentAxis = maxValAxis - minValAxis;
668-
669-
// validate that the axis has values before we try to use them for tick0 calculation
670-
if(baseAxis && baseAxis._vals.length > 0) {
671-
var _len = baseAxis._length - 1;
672-
673-
// get position of first & last axis' starting ticks
674-
var firstTickPosition = baseAxis.l2p(baseAxis._vals[0].x);
675-
var firstTickPercentage = firstTickPosition / _len;
676-
firstTickPercentage = Math.round(firstTickPercentage * 100) / 100;
677-
678-
var lastTickPosition = baseAxis.l2p(baseAxis._vals[baseAxis._vals.length - 1].x);
679-
var lastTickPercentage = lastTickPosition / _len;
680-
lastTickPercentage = Math.round(lastTickPercentage * 100) / 100;
681-
682-
// set current axis to have same starting tick position
683-
var firstOffset = rangeDeltaCurrentAxis * (1 - firstTickPercentage);
684-
ax.tick0 = firstOffset + minValAxis;
685-
686-
var lastOffset = rangeDeltaCurrentAxis * (1 - lastTickPercentage);
687-
ax.dtick = (lastOffset - firstOffset) / (baseAxis._vals.length - 1);
688-
}
689-
} else if(ax.tickmode === 'auto' || !ax.dtick) { // calculate max number of (auto) ticks to display based on plot size
660+
// calculate max number of (auto) ticks to display based on plot size
661+
if(ax.tickmode === 'auto' || !ax.dtick) {
690662
var nt = ax.nticks;
691663
var minPx;
692664

@@ -978,6 +950,17 @@ axes.calcTicks = function calcTicks(ax, opts) {
978950
}
979951
continue;
980952
}
953+
// fill tickVals based on overlaying axis
954+
if(mockAx.tickmode === 'sync') {
955+
if(major) {
956+
tickVals = [];
957+
ticksOut = syncTicks(ax);
958+
} else {
959+
minorTickVals = [];
960+
minorTicks = syncTicks(ax);
961+
}
962+
continue;
963+
}
981964

982965
// add a tiny bit so we get ticks which may have rounded out
983966
var exRng = expandRange(rng);
@@ -1231,6 +1214,48 @@ axes.calcTicks = function calcTicks(ax, opts) {
12311214
return ticksOut;
12321215
};
12331216

1217+
function syncTicks(ax) {
1218+
var rng = Lib.simpleMap(ax.range, ax.r2l);
1219+
var exRng = expandRange(rng);
1220+
var tickMin = Math.min(exRng[0], exRng[1]);
1221+
var tickMax = Math.max(exRng[0], exRng[1]);
1222+
1223+
// get the overlaying axis
1224+
var baseAxis = ax._mainAxis;
1225+
1226+
var ticksOut = [];
1227+
if(baseAxis && baseAxis._vals.length > 0) {
1228+
for(var isMinor = 0; isMinor <= 1; isMinor++) {
1229+
if(isMinor && !ax.minor) continue;
1230+
1231+
for(var i = 0; i < baseAxis._vals.length; i++) {
1232+
// get the position of the every tick
1233+
var pos = baseAxis.l2p(baseAxis._vals[i].x);
1234+
// get the tick for the current axis based on position
1235+
var vali = ax.p2l(pos);
1236+
if(vali > tickMin && vali < tickMax) {
1237+
var obj = axes.tickText(ax, vali);
1238+
1239+
if(isMinor) {
1240+
obj.minor = true;
1241+
obj.text = '';
1242+
}
1243+
1244+
ticksOut.push(obj);
1245+
}
1246+
}
1247+
}
1248+
}
1249+
1250+
if(ax.rangebreaks) {
1251+
// remove ticks falling inside rangebreaks
1252+
ticksOut = ticksOut.filter(function(d) {
1253+
return ax.maskBreaks(d.x) !== BADNUM;
1254+
});
1255+
}
1256+
return ticksOut;
1257+
}
1258+
12341259
function arrayTicks(ax) {
12351260
var rng = Lib.simpleMap(ax.range, ax.r2l);
12361261
var exRng = expandRange(rng);
@@ -3219,7 +3244,7 @@ axes.drawGrid = function(gd, ax, opts) {
32193244

32203245
var hasMinor = ax.minor && ax.minor.showgrid;
32213246
var minorVals = hasMinor ? opts.vals.filter(function(d) { return d.minor; }) : [];
3222-
var majorVals = ax.showgrid && ax.tickmode !== 'sync' ? opts.vals.filter(function(d) { return !d.minor; }) : [];
3247+
var majorVals = ax.showgrid ? opts.vals.filter(function(d) { return !d.minor; }) : [];
32233248

32243249
var counterAx = opts.counterAxis;
32253250
if(counterAx && axes.shouldShowZeroLine(gd, ax, counterAx)) {

0 commit comments

Comments
 (0)