Skip to content

Commit 07d59d5

Browse files
committed
fix handling of splom visible false dimensions
1 parent 4f68cba commit 07d59d5

File tree

8 files changed

+319
-48
lines changed

8 files changed

+319
-48
lines changed

src/traces/splom/base_plot.js

+12-7
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,20 @@ function drag(gd) {
4141
var cd0 = cd[i][0];
4242
var trace = cd0.trace;
4343
var scene = cd0.t._scene;
44+
var opts = scene.matrixOptions;
4445

4546
if(trace.type === 'splom' && scene && scene.matrix) {
46-
var dimLength = trace.dimensions.length;
47-
var ranges = new Array(dimLength);
48-
49-
for(var j = 0; j < dimLength; j++) {
50-
var xrng = AxisIDs.getFromId(gd, trace.xaxes[j]).range;
51-
var yrng = AxisIDs.getFromId(gd, trace.yaxes[j]).range;
52-
ranges[j] = [xrng[0], yrng[0], xrng[1], yrng[1]];
47+
var activeLength = trace._activeLength;
48+
var visibleLength = opts.data.length;
49+
var ranges = new Array(visibleLength);
50+
var k = 0;
51+
52+
for(var j = 0; j < activeLength; j++) {
53+
if(trace.dimensions[j].visible) {
54+
var xrng = AxisIDs.getFromId(gd, trace.xaxes[j]).range;
55+
var yrng = AxisIDs.getFromId(gd, trace.yaxes[j]).range;
56+
ranges[k++] = [xrng[0], yrng[0], xrng[1], yrng[1]];
57+
}
5358
}
5459

5560
scene.matrix.update({ranges: ranges});

src/traces/splom/defaults.js

+18-5
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ function handleDimensionsDefaults(traceIn, traceOut) {
7676
dimIn = dimensionsIn[i];
7777
dimOut = dimensionsOut[i] = {};
7878

79+
// coerce label even if dimensions may be `visible: false`,
80+
// to fill in axis title defaults
81+
coerce('label');
82+
7983
var visible = coerce('visible');
8084
if(!visible) continue;
8185

@@ -85,8 +89,6 @@ function handleDimensionsDefaults(traceIn, traceOut) {
8589
continue;
8690
}
8791

88-
coerce('label');
89-
9092
commonLength = Math.max(commonLength, values.length);
9193
dimOut._index = i;
9294
}
@@ -116,9 +118,20 @@ function handleAxisDefaults(traceIn, traceOut, layout, coerce) {
116118
var xaxes = coerce('xaxes', xaxesDflt);
117119
var yaxes = coerce('yaxes', yaxesDflt);
118120

119-
// TODO what to do when xaxes.length or yaxes.length !== dimLength ???
120-
121-
for(i = 0; i < dimLength; i++) {
121+
// splom defaults set three types of 'length' values on the
122+
// full data items:
123+
//
124+
// - _commonLength: is the common length of each dimensions[i].values
125+
// - dimensions[i]._length: is a copy of _commonLength to each dimensions item
126+
// (this one is used during ax.makeCalcdata)
127+
// - _activeLength: is the number of dimensions that can generate axes for a given trace
128+
//
129+
// when looping from 0..activeLength dimensions and (x|y)axes indices should match.
130+
// note that `visible: false` dimensions contribute to activeLength and must
131+
// be skipped before drawing calls.
132+
var activeLength = traceOut._activeLength = Math.min(dimLength, xaxes.length, yaxes.length);
133+
134+
for(i = 0; i < activeLength; i++) {
122135
var dim = dimensions[i];
123136
var xa = xaxes[i];
124137
var ya = yaxes[i];

src/traces/splom/index.js

+57-36
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,52 @@ var TOO_MANY_POINTS = require('../scattergl/constants').TOO_MANY_POINTS;
2525
function calc(gd, trace) {
2626
var stash = {};
2727
var opts = {};
28-
var i, xa, ya;
28+
var i, xa, ya, dim;
2929

30-
var dimLength = trace.dimensions.length;
31-
var hasTooManyPoints = (dimLength * trace._commonLength) > TOO_MANY_POINTS;
32-
var matrix = opts.data = new Array(dimLength);
30+
var commonLength = trace._commonLength;
31+
var activeLength = trace._activeLength;
32+
var matrix = opts.data = [];
3333

34-
for(i = 0; i < dimLength; i++) {
35-
// using xa or ya should make no difference here
36-
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
37-
matrix[i] = makeCalcdata(xa, trace, trace.dimensions[i]);
34+
for(i = 0; i < activeLength; i++) {
35+
dim = trace.dimensions[i];
36+
37+
if(dim.visible) {
38+
// using xa or ya should make no difference here
39+
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
40+
matrix.push(makeCalcdata(xa, trace, dim));
41+
}
3842
}
3943

4044
calcColorscales(trace);
4145
Lib.extendFlat(opts, convertMarkerStyle(trace));
4246

43-
for(i = 0; i < dimLength; i++) {
44-
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
45-
ya = AxisIDs.getFromId(gd, trace.yaxes[i]);
46-
47-
// Re-use SVG scatter axis expansion routine except
48-
// for graph with very large number of points where it
49-
// performs poorly.
50-
// In big data case, fake Axes.expand outputs with data bounds,
51-
// and an average size for array marker.size inputs.
52-
var ppad;
53-
if(hasTooManyPoints) {
54-
ppad = 2 * (opts.sizeAvg || Math.max(opts.size, 3));
55-
} else {
56-
ppad = calcMarkerSize(trace, trace._commonLength);
47+
var visibleLength = matrix.length;
48+
var hasTooManyPoints = (visibleLength * commonLength) > TOO_MANY_POINTS;
49+
var k = 0;
50+
51+
for(i = 0; i < activeLength; i++) {
52+
dim = trace.dimensions[i];
53+
54+
if(dim.visible) {
55+
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
56+
ya = AxisIDs.getFromId(gd, trace.yaxes[i]);
57+
58+
// Re-use SVG scatter axis expansion routine except
59+
// for graph with very large number of points where it
60+
// performs poorly.
61+
// In big data case, fake Axes.expand outputs with data bounds,
62+
// and an average size for array marker.size inputs.
63+
var ppad;
64+
if(hasTooManyPoints) {
65+
ppad = 2 * (opts.sizeAvg || Math.max(opts.size, 3));
66+
} else {
67+
ppad = calcMarkerSize(trace, commonLength);
68+
}
69+
calcAxisExpansion(gd, trace, xa, ya, matrix[k], matrix[k], ppad);
70+
k++;
5771
}
58-
calcAxisExpansion(gd, trace, xa, ya, matrix[i], matrix[i], ppad);
5972
}
6073

61-
6274
var scene = stash._scene = sceneUpdate(gd, stash);
6375
if(!scene.matrix) scene.matrix = true;
6476
scene.matrixOptions = opts;
@@ -167,21 +179,30 @@ function plot(gd, _, cdata) {
167179
function plotOne(gd, cd0) {
168180
var fullLayout = gd._fullLayout;
169181
var gs = fullLayout._size;
170-
var scene = cd0.t._scene;
171182
var trace = cd0.trace;
183+
var scene = cd0.t._scene;
184+
var opts = scene.matrixOptions;
185+
var matrix = opts.data;
172186
var regl = fullLayout._glcanvas.data()[0].regl;
173187

174-
var dimLength = trace.dimensions.length;
188+
if(matrix.length === 0) return;
189+
190+
var k = 0;
191+
var activeLength = trace._activeLength;
192+
var visibleLength = matrix.length;
175193
var viewOpts = {
176-
ranges: new Array(dimLength),
177-
domains: new Array(dimLength)
194+
ranges: new Array(visibleLength),
195+
domains: new Array(visibleLength)
178196
};
179197

180-
for(var i = 0; i < dimLength; i++) {
181-
var xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
182-
var ya = AxisIDs.getFromId(gd, trace.yaxes[i]);
183-
viewOpts.ranges[i] = [xa.range[0], ya.range[0], xa.range[1], ya.range[1]];
184-
viewOpts.domains[i] = [xa.domain[0], ya.domain[0], xa.domain[1], ya.domain[1]];
198+
for(var i = 0; i < activeLength; i++) {
199+
if(trace.dimensions[i].visible) {
200+
var xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
201+
var ya = AxisIDs.getFromId(gd, trace.yaxes[i]);
202+
viewOpts.ranges[k] = [xa.range[0], ya.range[0], xa.range[1], ya.range[1]];
203+
viewOpts.domains[k] = [xa.domain[0], ya.domain[0], xa.domain[1], ya.domain[1]];
204+
k++;
205+
}
185206
}
186207

187208
viewOpts.viewport = [gs.l, gs.b, gs.w + gs.l, gs.h + gs.b];
@@ -191,7 +212,7 @@ function plotOne(gd, cd0) {
191212
}
192213

193214
// FIXME: generate multiple options for single update
194-
scene.matrix.update(scene.matrixOptions);
215+
scene.matrix.update(opts);
195216
scene.matrix.update(viewOpts);
196217
scene.matrix.draw();
197218
}
@@ -214,8 +235,8 @@ function hoverPoints(pointData, xval, yval) {
214235
if(trace.yaxes[i] === ya._id) yi = i;
215236
}
216237

217-
var x = dimensions[xi].values;
218-
var y = dimensions[yi].values;
238+
var x = dimensions[xi].values || [];
239+
var y = dimensions[yi].values || [];
219240

220241
var id, ptx, pty, dx, dy, dist, dxy;
221242
var minDist = maxDistance;
29.7 KB
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"data": [
3+
{
4+
"type": "splom",
5+
"dimensions": [
6+
{
7+
"values": [
8+
1,
9+
2,
10+
3
11+
],
12+
"label": "A"
13+
},
14+
{
15+
"values": [
16+
4,
17+
5,
18+
6
19+
],
20+
"label": "B"
21+
}
22+
]
23+
},
24+
{
25+
"type": "splom",
26+
"dimensions": [
27+
{
28+
"values": [
29+
1,
30+
2,
31+
3
32+
],
33+
"label": "C"
34+
},
35+
{
36+
"values": [
37+
4,
38+
5,
39+
6
40+
],
41+
"label": "D"
42+
}
43+
],
44+
"xaxes": [
45+
"x3",
46+
"x4"
47+
],
48+
"yaxes": [
49+
"y3",
50+
"y4"
51+
]
52+
}
53+
],
54+
"layout": {
55+
"title": "ragged sploms using trace xaxes yaxes",
56+
"showlegend": false
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{
2+
"data": [
3+
{
4+
"type": "splom",
5+
"dimensions": [
6+
{
7+
"values": [
8+
1,
9+
2,
10+
3
11+
],
12+
"label": "A"
13+
},
14+
{
15+
"values": [
16+
4,
17+
5,
18+
6
19+
],
20+
"label": "B"
21+
}
22+
]
23+
},
24+
{
25+
"type": "splom",
26+
"dimensions": [
27+
{
28+
"visible": false
29+
},
30+
{
31+
"visible": false
32+
},
33+
{
34+
"values": [
35+
1,
36+
2,
37+
3
38+
],
39+
"label": "C"
40+
},
41+
{
42+
"values": [
43+
4,
44+
5,
45+
6
46+
],
47+
"label": "D"
48+
}
49+
]
50+
}
51+
],
52+
"layout": {
53+
"showlegend": false,
54+
"title": "ragged sploms using visible false dimensions"
55+
}
56+
}

0 commit comments

Comments
 (0)