Skip to content

Commit 25fa0c2

Browse files
authored
Merge pull request #3506 from plotly/matching-axes-final
Implementing matching axes
2 parents 12097a2 + 1713c83 commit 25fa0c2

30 files changed

+3612
-666
lines changed

src/plot_api/plot_api.js

+33-10
Original file line numberDiff line numberDiff line change
@@ -1940,22 +1940,34 @@ exports.relayout = relayout;
19401940
// Optimization mostly for large splom traces where
19411941
// Plots.supplyDefaults can take > 100ms
19421942
function axRangeSupplyDefaultsByPass(gd, flags, specs) {
1943-
var k;
1943+
var fullLayout = gd._fullLayout;
19441944

19451945
if(!flags.axrange) return false;
19461946

1947-
for(k in flags) {
1947+
for(var k in flags) {
19481948
if(k !== 'axrange' && flags[k]) return false;
19491949
}
19501950

1951-
for(k in specs.rangesAltered) {
1952-
var axName = Axes.id2name(k);
1951+
for(var axId in specs.rangesAltered) {
1952+
var axName = Axes.id2name(axId);
19531953
var axIn = gd.layout[axName];
1954-
var axOut = gd._fullLayout[axName];
1954+
var axOut = fullLayout[axName];
19551955
axOut.autorange = axIn.autorange;
19561956
axOut.range = axIn.range.slice();
19571957
axOut.cleanRange();
1958+
1959+
if(axOut._matchGroup) {
1960+
for(var axId2 in axOut._matchGroup) {
1961+
if(axId2 !== axId) {
1962+
var ax2 = fullLayout[Axes.id2name(axId2)];
1963+
ax2.autorange = axOut.autorange;
1964+
ax2.range = axOut.range.slice();
1965+
ax2._input.range = axOut.range.slice();
1966+
}
1967+
}
1968+
}
19581969
}
1970+
19591971
return true;
19601972
}
19611973

@@ -1965,14 +1977,25 @@ function addAxRangeSequence(seq, rangesAltered) {
19651977
// executed after drawData
19661978
var drawAxes = rangesAltered ?
19671979
function(gd) {
1968-
var opts = {skipTitle: true};
1980+
var axIds = [];
1981+
var skipTitle = true;
1982+
19691983
for(var id in rangesAltered) {
1970-
if(Axes.getFromId(gd, id).automargin) {
1971-
opts = {};
1972-
break;
1984+
var ax = Axes.getFromId(gd, id);
1985+
axIds.push(id);
1986+
1987+
if(ax._matchGroup) {
1988+
for(var id2 in ax._matchGroup) {
1989+
if(!rangesAltered[id2]) {
1990+
axIds.push(id2);
1991+
}
1992+
}
19731993
}
1994+
1995+
if(ax.automargin) skipTitle = false;
19741996
}
1975-
return Axes.draw(gd, Object.keys(rangesAltered), opts);
1997+
1998+
return Axes.draw(gd, axIds, {skipTitle: skipTitle});
19761999
} :
19772000
function(gd) {
19782001
return Axes.draw(gd, 'redraw');

src/plot_api/subroutines.js

+35-3
Original file line numberDiff line numberDiff line change
@@ -697,17 +697,49 @@ exports.redrawReglTraces = function(gd) {
697697
};
698698

699699
exports.doAutoRangeAndConstraints = function(gd) {
700+
var fullLayout = gd._fullLayout;
700701
var axList = Axes.list(gd, '', true);
702+
var matchGroups = fullLayout._axisMatchGroups || [];
703+
var ax;
701704

702705
for(var i = 0; i < axList.length; i++) {
703-
var ax = axList[i];
706+
ax = axList[i];
704707
cleanAxisConstraints(gd, ax);
705-
// in case margins changed, update scale
706-
ax.setScale();
707708
doAutoRange(gd, ax);
708709
}
709710

710711
enforceAxisConstraints(gd);
712+
713+
groupLoop:
714+
for(var j = 0; j < matchGroups.length; j++) {
715+
var group = matchGroups[j];
716+
var rng = null;
717+
var id;
718+
719+
for(id in group) {
720+
ax = Axes.getFromId(gd, id);
721+
if(ax.autorange === false) continue groupLoop;
722+
723+
if(rng) {
724+
if(rng[0] < rng[1]) {
725+
rng[0] = Math.min(rng[0], ax.range[0]);
726+
rng[1] = Math.max(rng[1], ax.range[1]);
727+
} else {
728+
rng[0] = Math.max(rng[0], ax.range[0]);
729+
rng[1] = Math.min(rng[1], ax.range[1]);
730+
}
731+
} else {
732+
rng = ax.range;
733+
}
734+
}
735+
736+
for(id in group) {
737+
ax = Axes.getFromId(gd, id);
738+
ax.range = rng.slice();
739+
ax._input.range = rng.slice();
740+
ax.setScale();
741+
}
742+
}
711743
};
712744

713745
// An initial paint must be completed before these components can be

src/plots/cartesian/autorange.js

+2
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ function concatExtremes(gd, ax) {
237237
}
238238

239239
function doAutoRange(gd, ax) {
240+
ax.setScale();
241+
240242
if(ax.autorange) {
241243
ax.range = getAutoRange(gd, ax);
242244

src/plots/cartesian/constraint_defaults.js

-152
This file was deleted.

0 commit comments

Comments
 (0)