Skip to content

Commit 9039a8e

Browse files
committed
keep track of visible dimensions using visibleDims list
... which simplifies logic downstream
1 parent b3d27bd commit 9039a8e

File tree

4 files changed

+98
-88
lines changed

4 files changed

+98
-88
lines changed

src/traces/splom/attributes.js

+17
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,23 @@ module.exports = {
5858
description: 'Sets the dimension values to be plotted.'
5959
},
6060

61+
axis: {
62+
type: {
63+
valType: 'enumerated',
64+
values: ['linear', 'log', 'date', 'category'],
65+
role: 'info',
66+
editType: 'calc+clearAxisTypes',
67+
description: [
68+
'Sets the axis type for this dimension\'s generated',
69+
'x and y axes.',
70+
'Note that the axis `type` values set in layout take',
71+
'precedence over this attribute.'
72+
].join(' ')
73+
},
74+
75+
editType: 'calc+clearAxisTypes'
76+
},
77+
6178
// TODO should add an attribute to pin down x only vars and y only vars
6279
// like https://seaborn.pydata.org/generated/seaborn.pairplot.html
6380
// x_vars and y_vars

src/traces/splom/base_plot.js

+17-19
Original file line numberDiff line numberDiff line change
@@ -45,36 +45,34 @@ function drag(gd) {
4545
for(var i = 0; i < cd.length; i++) {
4646
var cd0 = cd[i][0];
4747
var trace = cd0.trace;
48-
var scene = cd0.t._scene;
48+
var stash = cd0.t;
49+
var scene = stash._scene;
4950

5051
if(trace.type === 'splom' && scene && scene.matrix) {
51-
dragOne(gd, trace, scene);
52+
dragOne(gd, trace, stash, scene);
5253
}
5354
}
5455
}
5556

56-
function dragOne(gd, trace, scene) {
57-
var dimensions = trace.dimensions;
57+
function dragOne(gd, trace, stash, scene) {
5858
var visibleLength = scene.matrixOptions.data.length;
59+
var visibleDims = stash.visibleDims;
5960
var ranges = new Array(visibleLength);
6061

61-
for(var i = 0, k = 0; i < dimensions.length; i++) {
62-
if(dimensions[i].visible) {
63-
var rng = ranges[k] = new Array(4);
62+
for(var k = 0; k < visibleDims.length; k++) {
63+
var i = visibleDims[k];
64+
var rng = ranges[k] = new Array(4);
6465

65-
var xa = AxisIDs.getFromId(gd, trace._diag[i][0]);
66-
if(xa) {
67-
rng[0] = xa.r2l(xa.range[0]);
68-
rng[2] = xa.r2l(xa.range[1]);
69-
}
70-
71-
var ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
72-
if(ya) {
73-
rng[1] = ya.r2l(ya.range[0]);
74-
rng[3] = ya.r2l(ya.range[1]);
75-
}
66+
var xa = AxisIDs.getFromId(gd, trace._diag[i][0]);
67+
if(xa) {
68+
rng[0] = xa.r2l(xa.range[0]);
69+
rng[2] = xa.r2l(xa.range[1]);
70+
}
7671

77-
k++;
72+
var ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
73+
if(ya) {
74+
rng[1] = ya.r2l(ya.range[0]);
75+
rng[3] = ya.r2l(ya.range[1]);
7876
}
7977
}
8078

src/traces/splom/index.js

+63-69
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ function calc(gd, trace) {
3636
// only differ here for log axes, pass ldata to createMatrix as 'data'
3737
var cdata = opts.cdata = [];
3838
var ldata = opts.data = [];
39+
// keep track of visible dimensions
40+
var visibleDims = stash.visibleDims = [];
3941
var i, k, dim, xa, ya;
4042

4143
function makeCalcdata(ax, dim) {
@@ -71,6 +73,8 @@ function calc(gd, trace) {
7173
// should not make it here, if both xa and ya undefined
7274
makeCalcdata(ya, dim);
7375
}
76+
77+
visibleDims.push(i);
7478
}
7579
}
7680

@@ -80,26 +84,24 @@ function calc(gd, trace) {
8084
var visibleLength = cdata.length;
8185
var hasTooManyPoints = (visibleLength * commonLength) > TOO_MANY_POINTS;
8286

83-
for(i = 0, k = 0; i < dimensions.length; i++) {
87+
for(k = 0; k < visibleDims.length; k++) {
88+
i = visibleDims[k];
8489
dim = dimensions[i];
8590

86-
if(dim.visible) {
87-
xa = AxisIDs.getFromId(gd, trace._diag[i][0]) || {};
88-
ya = AxisIDs.getFromId(gd, trace._diag[i][1]) || {};
89-
90-
// Reuse SVG scatter axis expansion routine.
91-
// For graphs with very large number of points and array marker.size,
92-
// use average marker size instead to speed things up.
93-
var ppad;
94-
if(hasTooManyPoints) {
95-
ppad = 2 * (opts.sizeAvg || Math.max(opts.size, 3));
96-
} else {
97-
ppad = calcMarkerSize(trace, commonLength);
98-
}
99-
100-
calcAxisExpansion(gd, trace, xa, ya, cdata[k], cdata[k], ppad);
101-
k++;
91+
xa = AxisIDs.getFromId(gd, trace._diag[i][0]) || {};
92+
ya = AxisIDs.getFromId(gd, trace._diag[i][1]) || {};
93+
94+
// Reuse SVG scatter axis expansion routine.
95+
// For graphs with very large number of points and array marker.size,
96+
// use average marker size instead to speed things up.
97+
var ppad;
98+
if(hasTooManyPoints) {
99+
ppad = 2 * (opts.sizeAvg || Math.max(opts.size, 3));
100+
} else {
101+
ppad = calcMarkerSize(trace, commonLength);
102102
}
103+
104+
calcAxisExpansion(gd, trace, xa, ya, cdata[k], cdata[k], ppad);
103105
}
104106

105107
var scene = stash._scene = sceneUpdate(gd, stash);
@@ -133,9 +135,7 @@ function sceneUpdate(gd, stash) {
133135
// draw traces in selection mode
134136
if(scene.matrix && scene.selectBatch) {
135137
scene.matrix.draw(scene.unselectBatch, scene.selectBatch);
136-
}
137-
138-
else if(scene.matrix) {
138+
} else if(scene.matrix) {
139139
scene.matrix.draw();
140140
}
141141

@@ -191,34 +191,32 @@ function plotOne(gd, cd0) {
191191
matrixOpts.upper = trace.showlowerhalf;
192192
matrixOpts.diagonal = trace.diagonal.visible;
193193

194-
var dimensions = trace.dimensions;
194+
var visibleDims = stash.visibleDims;
195195
var visibleLength = cdata.length;
196196
var viewOpts = {};
197197
viewOpts.ranges = new Array(visibleLength);
198198
viewOpts.domains = new Array(visibleLength);
199199

200-
for(i = 0, k = 0; i < dimensions.length; i++) {
201-
if(trace.dimensions[i].visible) {
202-
var rng = viewOpts.ranges[k] = new Array(4);
203-
var dmn = viewOpts.domains[k] = new Array(4);
200+
for(k = 0; k < visibleDims.length; k++) {
201+
i = visibleDims[k];
204202

205-
xa = AxisIDs.getFromId(gd, trace._diag[i][0]);
206-
if(xa) {
207-
rng[0] = xa._rl[0];
208-
rng[2] = xa._rl[1];
209-
dmn[0] = xa.domain[0];
210-
dmn[2] = xa.domain[1];
211-
}
203+
var rng = viewOpts.ranges[k] = new Array(4);
204+
var dmn = viewOpts.domains[k] = new Array(4);
212205

213-
ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
214-
if(ya) {
215-
rng[1] = ya._rl[0];
216-
rng[3] = ya._rl[1];
217-
dmn[1] = ya.domain[0];
218-
dmn[3] = ya.domain[1];
219-
}
206+
xa = AxisIDs.getFromId(gd, trace._diag[i][0]);
207+
if(xa) {
208+
rng[0] = xa._rl[0];
209+
rng[2] = xa._rl[1];
210+
dmn[0] = xa.domain[0];
211+
dmn[2] = xa.domain[1];
212+
}
220213

221-
k++;
214+
ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
215+
if(ya) {
216+
rng[1] = ya._rl[0];
217+
rng[3] = ya._rl[1];
218+
dmn[1] = ya.domain[0];
219+
dmn[3] = ya.domain[1];
222220
}
223221
}
224222

@@ -260,25 +258,23 @@ function plotOne(gd, cd0) {
260258
var xpx = stash.xpx = new Array(visibleLength);
261259
var ypx = stash.ypx = new Array(visibleLength);
262260

263-
for(i = 0, k = 0; i < dimensions.length; i++) {
264-
if(trace.dimensions[i].visible) {
265-
xa = AxisIDs.getFromId(gd, trace._diag[i][0]);
266-
if(xa) {
267-
xpx[k] = new Array(commonLength);
268-
for(j = 0; j < commonLength; j++) {
269-
xpx[k][j] = xa.c2p(cdata[k][j]);
270-
}
271-
}
261+
for(k = 0; k < visibleDims.length; k++) {
262+
i = visibleDims[k];
272263

273-
ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
274-
if(ya) {
275-
ypx[k] = new Array(commonLength);
276-
for(j = 0; j < commonLength; j++) {
277-
ypx[k][j] = ya.c2p(cdata[k][j]);
278-
}
264+
xa = AxisIDs.getFromId(gd, trace._diag[i][0]);
265+
if(xa) {
266+
xpx[k] = new Array(commonLength);
267+
for(j = 0; j < commonLength; j++) {
268+
xpx[k][j] = xa.c2p(cdata[k][j]);
279269
}
270+
}
280271

281-
k++;
272+
ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
273+
if(ya) {
274+
ypx[k] = new Array(commonLength);
275+
for(j = 0; j < commonLength; j++) {
276+
ypx[k][j] = ya.c2p(cdata[k][j]);
277+
}
282278
}
283279
}
284280

@@ -293,8 +289,8 @@ function plotOne(gd, cd0) {
293289
}
294290
}
295291
else {
296-
scene.matrix.update(matrixOpts);
297-
scene.matrix.update(viewOpts);
292+
scene.matrix.update(matrixOpts, null);
293+
scene.matrix.update(viewOpts, null);
298294
stash.xpx = stash.ypx = null;
299295
}
300296

@@ -313,8 +309,8 @@ function hoverPoints(pointData, xval, yval) {
313309
var ypx = ya.c2p(yval);
314310
var maxDistance = pointData.distance;
315311

316-
var xi = getDimIndex(trace, xa);
317-
var yi = getDimIndex(trace, ya);
312+
var xi = getDimIndex(trace, stash, xa);
313+
var yi = getDimIndex(trace, stash, ya);
318314
if(xi === false || yi === false) return [pointData];
319315

320316
var x = cdata[xi];
@@ -363,8 +359,8 @@ function selectPoints(searchInfo, polygon) {
363359
var hasOnlyLines = (!subTypes.hasMarkers(trace) && !subTypes.hasText(trace));
364360
if(trace.visible !== true || hasOnlyLines) return selection;
365361

366-
var xi = getDimIndex(trace, xa);
367-
var yi = getDimIndex(trace, ya);
362+
var xi = getDimIndex(trace, stash, xa);
363+
var yi = getDimIndex(trace, stash, ya);
368364
if(xi === false || yi === false) return selection;
369365

370366
var xpx = stash.xpx[xi];
@@ -445,17 +441,15 @@ function style(gd, cds) {
445441
}
446442
}
447443

448-
function getDimIndex(trace, ax) {
444+
function getDimIndex(trace, stash, ax) {
449445
var axId = ax._id;
450446
var axLetter = axId.charAt(0);
451447
var ind = {x: 0, y: 1}[axLetter];
452-
var dimensions = trace.dimensions;
448+
var visibleDims = stash.visibleDims;
453449

454-
for(var i = 0, k = 0; i < dimensions.length; i++) {
455-
if(dimensions[i].visible) {
456-
if(trace._diag[i][ind] === axId) return k;
457-
k++;
458-
}
450+
for(var k = 0; k < visibleDims.length; k++) {
451+
var i = visibleDims[k];
452+
if(trace._diag[i][ind] === axId) return k;
459453
}
460454
return false;
461455
}

test/jasmine/tests/splom_test.js

+1
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ describe('Test splom trace calc step:', function() {
386386
var cd = gd.calcdata[0][0];
387387

388388
expect(cd.t._scene.matrixOptions.data).toBeCloseTo2DArray([[2, 1, 2]]);
389+
expect(cd.t.visibleDims).toEqual([1]);
389390
});
390391
});
391392

0 commit comments

Comments
 (0)