Skip to content

Commit a0caefd

Browse files
committed
fix and 🔒 splom on log and date axes
1 parent 45266ed commit a0caefd

File tree

9 files changed

+118
-51
lines changed

9 files changed

+118
-51
lines changed

src/plots/cartesian/type_defaults.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,20 @@ function getFirstNonEmptyTrace(data, id, axLetter) {
106106
for(var i = 0; i < data.length; i++) {
107107
var trace = data[i];
108108

109+
if(trace.type === 'splom' &&
110+
trace._commonLength > 0 &&
111+
trace['_' + axLetter + 'axes'][id]
112+
) {
113+
return trace;
114+
}
115+
109116
if((trace[axLetter + 'axis'] || axLetter) === id) {
110117
if(isBoxWithoutPositionCoords(trace, axLetter)) {
111118
return trace;
112119
}
113120
else if((trace[axLetter] || []).length || trace[axLetter + '0']) {
114121
return trace;
115122
}
116-
else if(trace.type === 'splom' &&
117-
trace._commonLength > 0 &&
118-
trace[axLetter + 'axes'].indexOf(id) === 0
119-
) {
120-
return trace;
121-
}
122123
}
123124
}
124125
}

src/traces/splom/attributes.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ module.exports = {
9191
// ...
9292
// more options
9393

94-
editType: 'plot'
94+
editType: 'calc'
9595
},
9696

9797
showupperhalf: {

src/traces/splom/base_plot.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,14 @@ function dragOne(gd, trace, scene) {
6363

6464
var xa = AxisIDs.getFromId(gd, trace._diag[i][0]);
6565
if(xa) {
66-
rng[0] = xa.range[0];
67-
rng[2] = xa.range[1];
66+
rng[0] = xa.r2l(xa.range[0]);
67+
rng[2] = xa.r2l(xa.range[1]);
6868
}
6969

7070
var ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
7171
if(ya) {
72-
rng[1] = ya.range[0];
73-
rng[3] = ya.range[1];
72+
rng[1] = ya.r2l(ya.range[0]);
73+
rng[3] = ya.r2l(ya.range[1]);
7474
}
7575

7676
k++;

src/traces/splom/defaults.js

+12
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ function handleAxisDefaults(traceIn, traceOut, layout, coerce) {
105105
var xaxes = coerce('xaxes', fillAxisIdArray('x', axDfltLength));
106106
var yaxes = coerce('yaxes', fillAxisIdArray('y', axDfltLength));
107107

108+
// to avoid costly indexOf
109+
traceOut._xaxes = arrayToHashObject(xaxes);
110+
traceOut._yaxes = arrayToHashObject(yaxes);
111+
108112
// allow users to under-specify number of axes
109113
var axLength = Math.min(axDfltLength, xaxes.length, yaxes.length);
110114

@@ -168,3 +172,11 @@ function fillAxisStash(layout, axId, dim) {
168172
stash[axId] = (dim || {}).label || '';
169173
}
170174
}
175+
176+
function arrayToHashObject(arr) {
177+
var obj = {};
178+
for(var i = 0; i < arr.length; i++) {
179+
obj[arr[i]] = 1;
180+
}
181+
return obj;
182+
}

src/traces/splom/index.js

+48-40
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ function calc(gd, trace) {
3030
var commonLength = trace._commonLength;
3131
var stash = {};
3232
var opts = {};
33-
var matrixData = opts.data = [];
33+
// 'c' for calculated, 'l' for linear,
34+
// only differ here for log axes, pass ldata to createMatrix as 'data'
35+
var cdata = opts.cdata = [];
36+
var ldata = opts.data = [];
3437
var i, k, dim;
3538

3639
for(i = 0; i < dimensions.length; i++) {
@@ -39,14 +42,19 @@ function calc(gd, trace) {
3942
if(dim.visible) {
4043
var axId = trace._diag[i][0] || trace._diag[i][1];
4144
var ax = AxisIDs.getFromId(gd, axId);
42-
if(ax) matrixData.push(makeCalcdata(ax, trace, dim));
45+
if(ax) {
46+
var ccol = makeCalcdata(ax, trace, dim);
47+
var lcol = ax.type === 'log' ? Lib.simpleMap(ccol, ax.c2l) : ccol;
48+
cdata.push(ccol);
49+
ldata.push(lcol);
50+
}
4351
}
4452
}
4553

4654
calcColorscales(trace);
4755
Lib.extendFlat(opts, convertMarkerStyle(trace));
4856

49-
var visibleLength = matrixData.length;
57+
var visibleLength = cdata.length;
5058
var hasTooManyPoints = (visibleLength * commonLength) > TOO_MANY_POINTS;
5159

5260
for(i = 0, k = 0; i < dimensions.length; i++) {
@@ -68,7 +76,7 @@ function calc(gd, trace) {
6876
ppad = calcMarkerSize(trace, commonLength);
6977
}
7078

71-
calcAxisExpansion(gd, trace, xa, ya, matrixData[k], matrixData[k], ppad);
79+
calcAxisExpansion(gd, trace, xa, ya, cdata[k], cdata[k], ppad);
7280
k++;
7381
}
7482
}
@@ -84,24 +92,17 @@ function calc(gd, trace) {
8492
}
8593

8694
function makeCalcdata(ax, trace, dim) {
87-
var i;
88-
89-
var cdata = ax.makeCalcdata({
95+
// call makeCalcdata with fake input
96+
var ccol = ax.makeCalcdata({
9097
v: dim.values,
9198
vcalendar: trace.calendar
9299
}, 'v');
93100

94-
for(i = 0; i < cdata.length; i++) {
95-
cdata[i] = cdata[i] === BADNUM ? NaN : cdata[i];
101+
for(var i = 0; i < ccol.length; i++) {
102+
ccol[i] = ccol[i] === BADNUM ? NaN : ccol[i];
96103
}
97104

98-
if(ax.type === 'log') {
99-
for(i = 0; i < cdata.length; i++) {
100-
cdata[i] = ax.c2l(cdata[i]);
101-
}
102-
}
103-
104-
return cdata;
105+
return ccol;
105106
}
106107

107108
function sceneUpdate(gd, stash) {
@@ -154,11 +155,11 @@ function sceneUpdate(gd, stash) {
154155
return scene;
155156
}
156157

157-
function plot(gd, _, cdata) {
158-
if(!cdata.length) return;
158+
function plot(gd, _, splomCalcData) {
159+
if(!splomCalcData.length) return;
159160

160-
for(var i = 0; i < cdata.length; i++) {
161-
plotOne(gd, cdata[i][0]);
161+
for(var i = 0; i < splomCalcData.length; i++) {
162+
plotOne(gd, splomCalcData[i][0]);
162163
}
163164
}
164165

@@ -169,13 +170,13 @@ function plotOne(gd, cd0) {
169170
var stash = cd0.t;
170171
var scene = stash._scene;
171172
var matrixOpts = scene.matrixOptions;
172-
var matrixData = matrixOpts.data;
173+
var cdata = matrixOpts.cdata;
173174
var regl = fullLayout._glcanvas.data()[0].regl;
174175
var dragmode = fullLayout.dragmode;
175176
var xa, ya;
176177
var i, j, k;
177178

178-
if(matrixData.length === 0) return;
179+
if(cdata.length === 0) return;
179180

180181
// augment options with proper upper/lower halves
181182
// regl-scattermatrix's default grid start from bottom-left
@@ -184,7 +185,7 @@ function plotOne(gd, cd0) {
184185
matrixOpts.diagonal = trace.diagonal.visible;
185186

186187
var dimensions = trace.dimensions;
187-
var visibleLength = matrixData.length;
188+
var visibleLength = cdata.length;
188189
var viewOpts = {};
189190
viewOpts.ranges = new Array(visibleLength);
190191
viewOpts.domains = new Array(visibleLength);
@@ -196,16 +197,16 @@ function plotOne(gd, cd0) {
196197

197198
xa = AxisIDs.getFromId(gd, trace._diag[i][0]);
198199
if(xa) {
199-
rng[0] = xa.range[0];
200-
rng[2] = xa.range[1];
200+
rng[0] = xa._rl[0];
201+
rng[2] = xa._rl[1];
201202
dmn[0] = xa.domain[0];
202203
dmn[2] = xa.domain[1];
203204
}
204205

205206
ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
206207
if(ya) {
207-
rng[1] = ya.range[0];
208-
rng[3] = ya.range[1];
208+
rng[1] = ya._rl[0];
209+
rng[3] = ya._rl[1];
209210
dmn[1] = ya.domain[0];
210211
dmn[3] = ya.domain[1];
211212
}
@@ -258,15 +259,15 @@ function plotOne(gd, cd0) {
258259
if(xa) {
259260
xpx[k] = new Array(commonLength);
260261
for(j = 0; j < commonLength; j++) {
261-
xpx[k][j] = xa.c2p(matrixData[k][j]);
262+
xpx[k][j] = xa.c2p(cdata[k][j]);
262263
}
263264
}
264265

265266
ya = AxisIDs.getFromId(gd, trace._diag[i][1]);
266267
if(ya) {
267268
ypx[k] = new Array(commonLength);
268269
for(j = 0; j < commonLength; j++) {
269-
ypx[k][j] = ya.c2p(matrixData[k][j]);
270+
ypx[k][j] = ya.c2p(cdata[k][j]);
270271
}
271272
}
272273

@@ -298,19 +299,21 @@ function plotOne(gd, cd0) {
298299
function hoverPoints(pointData, xval, yval) {
299300
var cd = pointData.cd;
300301
var trace = cd[0].trace;
302+
var stash = cd[0].t;
303+
var scene = stash._scene;
304+
var cdata = scene.matrixOptions.cdata;
301305
var xa = pointData.xa;
302306
var ya = pointData.ya;
303307
var xpx = xa.c2p(xval);
304308
var ypx = ya.c2p(yval);
305309
var maxDistance = pointData.distance;
306-
var dimensions = trace.dimensions;
307310

308311
var xi = getDimIndex(trace, xa);
309312
var yi = getDimIndex(trace, ya);
310-
if(xi === undefined || yi === undefined) return [pointData];
313+
if(xi === false || yi === false) return [pointData];
311314

312-
var x = dimensions[xi].values || [];
313-
var y = dimensions[yi].values || [];
315+
var x = cdata[xi];
316+
var y = cdata[yi];
314317

315318
var id, dxy;
316319
var minDist = maxDistance;
@@ -341,13 +344,13 @@ function hoverPoints(pointData, xval, yval) {
341344

342345
function selectPoints(searchInfo, polygon) {
343346
var cd = searchInfo.cd;
344-
var selection = [];
345347
var trace = cd[0].trace;
346348
var stash = cd[0].t;
347349
var scene = stash._scene;
350+
var cdata = scene.matrixOptions.cdata;
348351
var xa = searchInfo.xaxis;
349352
var ya = searchInfo.yaxis;
350-
var matrixData = scene.matrixOptions.data;
353+
var selection = [];
351354
var i;
352355

353356
if(!scene) return selection;
@@ -357,12 +360,12 @@ function selectPoints(searchInfo, polygon) {
357360

358361
var xi = getDimIndex(trace, xa);
359362
var yi = getDimIndex(trace, ya);
360-
if(xi === undefined || yi === undefined) return selection;
363+
if(xi === false || yi === false) return selection;
361364

362365
var xpx = stash.xpx[xi];
363366
var ypx = stash.ypx[yi];
364-
var x = matrixData[xi];
365-
var y = matrixData[yi];
367+
var x = cdata[xi];
368+
var y = cdata[yi];
366369

367370
// degenerate polygon does not enable selection
368371
// filter out points by visible scatter ones
@@ -423,10 +426,15 @@ function getDimIndex(trace, ax) {
423426
var axId = ax._id;
424427
var axLetter = axId.charAt(0);
425428
var ind = {x: 0, y: 1}[axLetter];
429+
var dimensions = trace.dimensions;
426430

427-
for(var i = 0; i < trace.dimensions.length; i++) {
428-
if(trace._diag[i][ind] === axId) return i;
431+
for(var i = 0, k = 0; i < dimensions.length; i++) {
432+
if(dimensions[i].visible) {
433+
if(trace._diag[i][ind] === axId) return k;
434+
k++;
435+
}
429436
}
437+
return false;
430438
}
431439

432440
module.exports = {

test/image/baselines/splom_dates.png

20.6 KB
Loading

test/image/baselines/splom_log.png

28.5 KB
Loading

test/image/mocks/splom_dates.json

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"data": [{
3+
"type": "splom",
4+
"dimensions": [{
5+
"values": ["2000-01-01", "2001-02-01", "2010-10-03"],
6+
"label": "A"
7+
}, {
8+
"values": ["2003-04-21", "2012-02-01", "2005-10-03"],
9+
"label": "B"
10+
}],
11+
"marker": {
12+
"symbol": "cross"
13+
},
14+
"selected": {
15+
"marker": {"color": "green"}
16+
},
17+
"unselected": {
18+
"marker": {"color": "red"}
19+
},
20+
"selectedpoints": [0, 2]
21+
}]
22+
}

test/image/mocks/splom_log.json

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"data": [{
3+
"type": "splom",
4+
"dimensions": [{
5+
"values": [1e1, 1e2, 1e3],
6+
"label": "A"
7+
}, {
8+
"values": [1e2, 1e5, 1e6],
9+
"label": "B"
10+
}],
11+
"marker": {
12+
"size": 20,
13+
"line": {"width": 2, "color": "#444"},
14+
"color": [10, 40, 100],
15+
"colorscale": "Reds"
16+
}
17+
}],
18+
"layout": {
19+
"xaxis": {"type": "log"},
20+
"yaxis": {"type": "log"},
21+
"xaxis2": {"type": "log"},
22+
"yaxis2": {"type": "log"}
23+
}
24+
}

0 commit comments

Comments
 (0)