Skip to content

Commit 0f532f3

Browse files
committed
fix show/hide ordering for contourcarpet matching contour
1 parent 7f0db7c commit 0f532f3

File tree

3 files changed

+63
-37
lines changed

3 files changed

+63
-37
lines changed

src/traces/contour/plot.js

+7-16
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ var constants = require('./constants');
2727
var costConstants = constants.LABELOPTIMIZER;
2828

2929
exports.plot = function plot(gd, plotinfo, cdcontours, contourLayer) {
30+
plotWrapper(gd, plotinfo, cdcontours, contourLayer, plotOne);
31+
};
32+
33+
function plotWrapper(gd, plotinfo, cdcontours, contourLayer, plotOneFn) {
3034
var contours = contourLayer.selectAll('g.contour')
3135
.data(
3236
cdcontours.map(function(d) { return d[0]; }),
@@ -39,10 +43,11 @@ exports.plot = function plot(gd, plotinfo, cdcontours, contourLayer) {
3943
.classed('contour', true);
4044

4145
contours.each(function(cd) {
42-
plotOne(gd, plotinfo, cd, d3.select(this));
46+
plotOneFn(gd, plotinfo, cd, d3.select(this));
4347
})
4448
.order();
45-
};
49+
}
50+
exports.plotWrapper = plotWrapper;
4651

4752
function plotOne(gd, plotinfo, cd, plotGroup) {
4853
var trace = cd.trace;
@@ -95,20 +100,6 @@ function plotOne(gd, plotinfo, cd, plotGroup) {
95100
clipGaps(plotGroup, plotinfo, fullLayout._clips, cd, perimeter);
96101
}
97102

98-
exports.makeContourGroup = function(layer, cd, id) {
99-
var plotgroup = layer
100-
.selectAll('g.contour.' + id)
101-
.data(cd);
102-
103-
plotgroup.enter().append('g')
104-
.classed('contour', true)
105-
.classed(id, true);
106-
107-
plotgroup.exit().remove();
108-
109-
return plotgroup;
110-
};
111-
112103
function makeBackground(plotgroup, perimeter, contours) {
113104
var bggroup = Lib.ensureSingle(plotgroup, 'g', 'contourbg');
114105

src/traces/contourcarpet/plot.js

+7-21
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ var map1dArray = require('../carpet/map_1d_array');
1313
var makepath = require('../carpet/makepath');
1414
var Drawing = require('../../components/drawing');
1515
var Lib = require('../../lib');
16-
var getUidsFromCalcData = require('../../plots/get_data').getUidsFromCalcData;
1716

1817
var makeCrossings = require('../contour/make_crossings');
1918
var findAllPaths = require('../contour/find_all_paths');
@@ -27,35 +26,23 @@ var lookupCarpet = require('../carpet/lookup_carpetid');
2726
var closeBoundaries = require('../contour/close_boundaries');
2827

2928
module.exports = function plot(gd, plotinfo, cdcontours, contourcarpetLayer) {
30-
var uidLookup = getUidsFromCalcData(cdcontours);
31-
32-
contourcarpetLayer.selectAll('g.contour').each(function(d) {
33-
if(!uidLookup[d.trace.uid]) {
34-
d3.select(this).remove();
35-
}
36-
});
37-
38-
for(var i = 0; i < cdcontours.length; i++) {
39-
plotOne(gd, plotinfo, cdcontours[i], contourcarpetLayer);
40-
}
29+
contourPlot.plotWrapper(gd, plotinfo, cdcontours, contourcarpetLayer, plotOne);
4130
};
4231

43-
function plotOne(gd, plotinfo, cd, contourcarpetLayer) {
44-
var trace = cd[0].trace;
32+
function plotOne(gd, plotinfo, cd, plotGroup) {
33+
var trace = cd.trace;
4534

4635
var carpet = trace._carpetTrace = lookupCarpet(gd, trace);
4736
var carpetcd = gd.calcdata[carpet.index][0];
4837

4938
if(!carpet.visible || carpet.visible === 'legendonly') return;
5039

51-
var a = cd[0].a;
52-
var b = cd[0].b;
40+
var a = cd.a;
41+
var b = cd.b;
5342
var contours = trace.contours;
54-
var uid = trace.uid;
5543
var xa = plotinfo.xaxis;
5644
var ya = plotinfo.yaxis;
57-
var id = 'contour' + uid;
58-
var pathinfo = emptyPathinfo(contours, plotinfo, cd[0]);
45+
var pathinfo = emptyPathinfo(contours, plotinfo, cd);
5946
var isConstraint = contours.type === 'constraint';
6047
var operation = contours._operation;
6148
var coloring = isConstraint ? (operation === '=' ? 'lines' : 'fill') : contours.coloring;
@@ -98,7 +85,6 @@ function plotOne(gd, plotinfo, cd, contourcarpetLayer) {
9885
mapPathinfo(pathinfo, ab2p);
9986

10087
// draw everything
101-
var plotGroup = contourPlot.makeContourGroup(contourcarpetLayer, cd, id);
10288

10389
// Compute the boundary path
10490
var seg, xp, yp, i;
@@ -124,7 +110,7 @@ function plotOne(gd, plotinfo, cd, contourcarpetLayer) {
124110
makeFills(trace, plotGroup, xa, ya, fillPathinfo, perimeter, ab2p, carpet, carpetcd, coloring, boundaryPath);
125111

126112
// Draw contour lines:
127-
makeLinesAndLabels(plotGroup, pathinfo, gd, cd[0], contours, plotinfo, carpet);
113+
makeLinesAndLabels(plotGroup, pathinfo, gd, cd, contours, plotinfo, carpet);
128114

129115
// Clip the boundary of the plot
130116
Drawing.setClipUrl(plotGroup, carpet._clipPathId);

test/jasmine/tests/carpet_test.js

+49
Original file line numberDiff line numberDiff line change
@@ -646,3 +646,52 @@ describe('scattercarpet hover labels', function() {
646646
.then(done);
647647
});
648648
});
649+
650+
describe('contourcarpet plotting & editing', function() {
651+
var gd;
652+
653+
beforeEach(function() {
654+
gd = createGraphDiv();
655+
});
656+
afterEach(destroyGraphDiv);
657+
658+
it('keeps the correct ordering after hide and show', function(done) {
659+
function getIndices() {
660+
var out = [];
661+
d3.selectAll('.contour').each(function(d) { out.push(d.trace.index); });
662+
return out;
663+
}
664+
665+
Plotly.newPlot(gd, [{
666+
type: 'carpet',
667+
a: [1, 1, 1, 3, 3, 3, 5, 5, 5],
668+
b: [1, 2, 3, 1, 2, 3, 1, 2, 3],
669+
y: [1, 2, 3, 2, 3, 4, 3, 4, 5],
670+
cheaterslope: 2
671+
}, {
672+
type: 'contourcarpet',
673+
a: [1, 1, 1, 3, 3, 3, 5, 5, 5],
674+
b: [1, 2, 3, 1, 2, 3, 1, 2, 3],
675+
z: [1, 2, 3, 4, 5, 6, 7, 8, 9]
676+
}, {
677+
type: 'contourcarpet',
678+
a: [1, 1, 1, 3, 3, 3, 5, 5, 5],
679+
b: [1, 2, 3, 1, 2, 3, 1, 2, 3],
680+
z: [1, 4, 7, 2, 5, 8, 3, 6, 9],
681+
contours: {coloring: 'lines'}
682+
}])
683+
.then(function() {
684+
expect(getIndices()).toEqual([1, 2]);
685+
return Plotly.restyle(gd, 'visible', false, [1]);
686+
})
687+
.then(function() {
688+
expect(getIndices()).toEqual([2]);
689+
return Plotly.restyle(gd, 'visible', true, [1]);
690+
})
691+
.then(function() {
692+
expect(getIndices()).toEqual([1, 2]);
693+
})
694+
.catch(fail)
695+
.then(done);
696+
});
697+
});

0 commit comments

Comments
 (0)