Skip to content

Commit

Permalink
fix handling of splom visible false dimensions
Browse files Browse the repository at this point in the history
  • Loading branch information
etpinard committed Mar 29, 2018
1 parent 4f68cba commit 07d59d5
Show file tree
Hide file tree
Showing 8 changed files with 319 additions and 48 deletions.
19 changes: 12 additions & 7 deletions src/traces/splom/base_plot.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,20 @@ function drag(gd) {
var cd0 = cd[i][0];
var trace = cd0.trace;
var scene = cd0.t._scene;
var opts = scene.matrixOptions;

if(trace.type === 'splom' && scene && scene.matrix) {
var dimLength = trace.dimensions.length;
var ranges = new Array(dimLength);

for(var j = 0; j < dimLength; j++) {
var xrng = AxisIDs.getFromId(gd, trace.xaxes[j]).range;
var yrng = AxisIDs.getFromId(gd, trace.yaxes[j]).range;
ranges[j] = [xrng[0], yrng[0], xrng[1], yrng[1]];
var activeLength = trace._activeLength;
var visibleLength = opts.data.length;
var ranges = new Array(visibleLength);
var k = 0;

for(var j = 0; j < activeLength; j++) {
if(trace.dimensions[j].visible) {
var xrng = AxisIDs.getFromId(gd, trace.xaxes[j]).range;
var yrng = AxisIDs.getFromId(gd, trace.yaxes[j]).range;
ranges[k++] = [xrng[0], yrng[0], xrng[1], yrng[1]];
}
}

scene.matrix.update({ranges: ranges});
Expand Down
23 changes: 18 additions & 5 deletions src/traces/splom/defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ function handleDimensionsDefaults(traceIn, traceOut) {
dimIn = dimensionsIn[i];
dimOut = dimensionsOut[i] = {};

// coerce label even if dimensions may be `visible: false`,
// to fill in axis title defaults
coerce('label');

var visible = coerce('visible');
if(!visible) continue;

Expand All @@ -85,8 +89,6 @@ function handleDimensionsDefaults(traceIn, traceOut) {
continue;
}

coerce('label');

commonLength = Math.max(commonLength, values.length);
dimOut._index = i;
}
Expand Down Expand Up @@ -116,9 +118,20 @@ function handleAxisDefaults(traceIn, traceOut, layout, coerce) {
var xaxes = coerce('xaxes', xaxesDflt);
var yaxes = coerce('yaxes', yaxesDflt);

// TODO what to do when xaxes.length or yaxes.length !== dimLength ???

for(i = 0; i < dimLength; i++) {
// splom defaults set three types of 'length' values on the
// full data items:
//
// - _commonLength: is the common length of each dimensions[i].values
// - dimensions[i]._length: is a copy of _commonLength to each dimensions item
// (this one is used during ax.makeCalcdata)
// - _activeLength: is the number of dimensions that can generate axes for a given trace
//
// when looping from 0..activeLength dimensions and (x|y)axes indices should match.
// note that `visible: false` dimensions contribute to activeLength and must
// be skipped before drawing calls.
var activeLength = traceOut._activeLength = Math.min(dimLength, xaxes.length, yaxes.length);

for(i = 0; i < activeLength; i++) {
var dim = dimensions[i];
var xa = xaxes[i];
var ya = yaxes[i];
Expand Down
93 changes: 57 additions & 36 deletions src/traces/splom/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,40 +25,52 @@ var TOO_MANY_POINTS = require('../scattergl/constants').TOO_MANY_POINTS;
function calc(gd, trace) {
var stash = {};
var opts = {};
var i, xa, ya;
var i, xa, ya, dim;

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

for(i = 0; i < dimLength; i++) {
// using xa or ya should make no difference here
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
matrix[i] = makeCalcdata(xa, trace, trace.dimensions[i]);
for(i = 0; i < activeLength; i++) {
dim = trace.dimensions[i];

if(dim.visible) {
// using xa or ya should make no difference here
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
matrix.push(makeCalcdata(xa, trace, dim));
}
}

calcColorscales(trace);
Lib.extendFlat(opts, convertMarkerStyle(trace));

for(i = 0; i < dimLength; i++) {
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
ya = AxisIDs.getFromId(gd, trace.yaxes[i]);

// Re-use SVG scatter axis expansion routine except
// for graph with very large number of points where it
// performs poorly.
// In big data case, fake Axes.expand outputs with data bounds,
// and an average size for array marker.size inputs.
var ppad;
if(hasTooManyPoints) {
ppad = 2 * (opts.sizeAvg || Math.max(opts.size, 3));
} else {
ppad = calcMarkerSize(trace, trace._commonLength);
var visibleLength = matrix.length;
var hasTooManyPoints = (visibleLength * commonLength) > TOO_MANY_POINTS;
var k = 0;

for(i = 0; i < activeLength; i++) {
dim = trace.dimensions[i];

if(dim.visible) {
xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
ya = AxisIDs.getFromId(gd, trace.yaxes[i]);

// Re-use SVG scatter axis expansion routine except
// for graph with very large number of points where it
// performs poorly.
// In big data case, fake Axes.expand outputs with data bounds,
// and an average size for array marker.size inputs.
var ppad;
if(hasTooManyPoints) {
ppad = 2 * (opts.sizeAvg || Math.max(opts.size, 3));
} else {
ppad = calcMarkerSize(trace, commonLength);
}
calcAxisExpansion(gd, trace, xa, ya, matrix[k], matrix[k], ppad);
k++;
}
calcAxisExpansion(gd, trace, xa, ya, matrix[i], matrix[i], ppad);
}


var scene = stash._scene = sceneUpdate(gd, stash);
if(!scene.matrix) scene.matrix = true;
scene.matrixOptions = opts;
Expand Down Expand Up @@ -167,21 +179,30 @@ function plot(gd, _, cdata) {
function plotOne(gd, cd0) {
var fullLayout = gd._fullLayout;
var gs = fullLayout._size;
var scene = cd0.t._scene;
var trace = cd0.trace;
var scene = cd0.t._scene;
var opts = scene.matrixOptions;
var matrix = opts.data;
var regl = fullLayout._glcanvas.data()[0].regl;

var dimLength = trace.dimensions.length;
if(matrix.length === 0) return;

var k = 0;
var activeLength = trace._activeLength;
var visibleLength = matrix.length;
var viewOpts = {
ranges: new Array(dimLength),
domains: new Array(dimLength)
ranges: new Array(visibleLength),
domains: new Array(visibleLength)
};

for(var i = 0; i < dimLength; i++) {
var xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
var ya = AxisIDs.getFromId(gd, trace.yaxes[i]);
viewOpts.ranges[i] = [xa.range[0], ya.range[0], xa.range[1], ya.range[1]];
viewOpts.domains[i] = [xa.domain[0], ya.domain[0], xa.domain[1], ya.domain[1]];
for(var i = 0; i < activeLength; i++) {
if(trace.dimensions[i].visible) {
var xa = AxisIDs.getFromId(gd, trace.xaxes[i]);
var ya = AxisIDs.getFromId(gd, trace.yaxes[i]);
viewOpts.ranges[k] = [xa.range[0], ya.range[0], xa.range[1], ya.range[1]];
viewOpts.domains[k] = [xa.domain[0], ya.domain[0], xa.domain[1], ya.domain[1]];
k++;
}
}

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

// FIXME: generate multiple options for single update
scene.matrix.update(scene.matrixOptions);
scene.matrix.update(opts);
scene.matrix.update(viewOpts);
scene.matrix.draw();
}
Expand All @@ -214,8 +235,8 @@ function hoverPoints(pointData, xval, yval) {
if(trace.yaxes[i] === ya._id) yi = i;
}

var x = dimensions[xi].values;
var y = dimensions[yi].values;
var x = dimensions[xi].values || [];
var y = dimensions[yi].values || [];

var id, ptx, pty, dx, dy, dist, dxy;
var minDist = maxDistance;
Expand Down
Binary file added test/image/baselines/splom_ragged-via-axes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
58 changes: 58 additions & 0 deletions test/image/mocks/splom_ragged-via-axes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"data": [
{
"type": "splom",
"dimensions": [
{
"values": [
1,
2,
3
],
"label": "A"
},
{
"values": [
4,
5,
6
],
"label": "B"
}
]
},
{
"type": "splom",
"dimensions": [
{
"values": [
1,
2,
3
],
"label": "C"
},
{
"values": [
4,
5,
6
],
"label": "D"
}
],
"xaxes": [
"x3",
"x4"
],
"yaxes": [
"y3",
"y4"
]
}
],
"layout": {
"title": "ragged sploms using trace xaxes yaxes",
"showlegend": false
}
}
56 changes: 56 additions & 0 deletions test/image/mocks/splom_ragged-via-visible-false.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{
"data": [
{
"type": "splom",
"dimensions": [
{
"values": [
1,
2,
3
],
"label": "A"
},
{
"values": [
4,
5,
6
],
"label": "B"
}
]
},
{
"type": "splom",
"dimensions": [
{
"visible": false
},
{
"visible": false
},
{
"values": [
1,
2,
3
],
"label": "C"
},
{
"values": [
4,
5,
6
],
"label": "D"
}
]
}
],
"layout": {
"showlegend": false,
"title": "ragged sploms using visible false dimensions"
}
}
Loading

0 comments on commit 07d59d5

Please sign in to comment.