From 64488c90d5e23a26fe36ee831a6f15a83d513f04 Mon Sep 17 00:00:00 2001 From: mikolalysenko Date: Tue, 19 Apr 2016 15:18:07 -0700 Subject: [PATCH 1/4] implement connect gaps for 2d webgl plots --- package.json | 2 +- src/traces/scattergl/attributes.js | 1 + src/traces/scattergl/convert.js | 21 +++++++++++++++++++-- src/traces/scattergl/defaults.js | 1 + test/image/mocks/gl2d_connect_gaps.json | 21 +++++++++++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 test/image/mocks/gl2d_connect_gaps.json diff --git a/package.json b/package.json index eef6fca7c3a..cfd7c1c5585 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "gl-error2d": "^1.0.0", "gl-error3d": "^1.0.0", "gl-heatmap2d": "^1.0.2", - "gl-line2d": "^1.2.1", + "gl-line2d": "^1.3.0", "gl-line3d": "^1.1.0", "gl-mat4": "^1.1.2", "gl-mesh3d": "^1.0.7", diff --git a/src/traces/scattergl/attributes.js b/src/traces/scattergl/attributes.js index 31008d79120..7badacf9f8f 100644 --- a/src/traces/scattergl/attributes.js +++ b/src/traces/scattergl/attributes.js @@ -86,6 +86,7 @@ module.exports = { reversescale: scatterMarkerLineAttrs.reversescale } }, + connectgaps: scatterAttrs.connectgaps, fill: extendFlat({}, scatterAttrs.fill, { values: ['none', 'tozeroy', 'tozerox'] }), diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index 089da9e7fc5..aa07c331a4b 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -39,6 +39,7 @@ function LineWithMarkers(scene, uid) { this.color = 'rgb(0, 0, 0)'; this.name = ''; this.hoverinfo = 'all'; + this.connectgaps = true; this.idToIndex = []; this.bounds = [0, 0, 0, 0]; @@ -103,7 +104,10 @@ function LineWithMarkers(scene, uid) { var proto = LineWithMarkers.prototype; proto.handlePick = function(pickResult) { - var index = this.idToIndex[pickResult.pointId]; + var index = pickResult.pointId + if (pickResult.object !== this.line || this.connectgaps) { + index = this.idToIndex[pickResult.pointId]; + } return { trace: this, @@ -248,6 +252,7 @@ proto.update = function(options) { this.name = options.name; this.hoverinfo = options.hoverinfo; this.bounds = [Infinity, Infinity, -Infinity, -Infinity]; + this.connectgaps = !!options.connectgaps if(this.isFancy(options)) { this.updateFancy(options); @@ -461,7 +466,19 @@ proto.updateFancy = function(options) { proto.updateLines = function(options, positions) { if(this.hasLines) { - this.lineOptions.positions = positions; + var linePositions = positions + if (!options.connectgaps) { + var p = 0; + var x = this.xData; + var y = this.yData; + linePositions = new Float32Array(2 * x.length) + + for(var i=0; i Date: Tue, 19 Apr 2016 15:43:31 -0700 Subject: [PATCH 2/4] fix linter errors --- package.json | 3 ++- src/traces/scattergl/convert.js | 35 +++++++++++++++++---------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index cfd7c1c5585..dcf394cff4b 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "cibuild": "node tasks/cibundle.js", "watch": "node tasks/watch_plotly.js", "lint": "eslint . || true", + "lint-fix": "eslint . --fix", "test-jasmine": "karma start test/jasmine/karma.conf.js", "citest-jasmine": "karma start test/jasmine/karma.ciconf.js", "test-image": "./tasks/test_image.sh", @@ -85,7 +86,7 @@ "browserify": "^13.0.0", "browserify-transform-tools": "^1.5.1", "ecstatic": "^1.4.0", - "eslint": "^2.1.0", + "eslint": "^2.8.0", "falafel": "^1.2.0", "fs-extra": "^0.27.0", "fuse.js": "^2.2.0", diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index aa07c331a4b..fc39f9462ff 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -104,9 +104,9 @@ function LineWithMarkers(scene, uid) { var proto = LineWithMarkers.prototype; proto.handlePick = function(pickResult) { - var index = pickResult.pointId - if (pickResult.object !== this.line || this.connectgaps) { - index = this.idToIndex[pickResult.pointId]; + var index = pickResult.pointId; + if(pickResult.object !== this.line || this.connectgaps) { + index = this.idToIndex[pickResult.pointId]; } return { @@ -252,7 +252,7 @@ proto.update = function(options) { this.name = options.name; this.hoverinfo = options.hoverinfo; this.bounds = [Infinity, Infinity, -Infinity, -Infinity]; - this.connectgaps = !!options.connectgaps + this.connectgaps = !!options.connectgaps; if(this.isFancy(options)) { this.updateFancy(options); @@ -465,20 +465,21 @@ proto.updateFancy = function(options) { }; proto.updateLines = function(options, positions) { + var i; if(this.hasLines) { - var linePositions = positions - if (!options.connectgaps) { - var p = 0; - var x = this.xData; - var y = this.yData; - linePositions = new Float32Array(2 * x.length) - - for(var i=0; i Date: Sat, 30 Apr 2016 22:21:53 -0700 Subject: [PATCH 3/4] fix calculation of xdata/ydata for fancy scattergl --- src/traces/scattergl/convert.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index fc39f9462ff..88949a1f146 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -349,8 +349,11 @@ proto.updateFancy = function(options) { bounds = this.bounds; // makeCalcdata runs d2c (data-to-coordinate) on every point - var x = this.xData = xaxis.makeCalcdata(options, 'x'); - var y = this.yData = yaxis.makeCalcdata(options, 'y'); + var x = xaxis.makeCalcdata(options, 'x').slice(); + var y = yaxis.makeCalcdata(options, 'y').slice(); + + this.xData = x.slice(); + this.yData = y.slice(); // get error values var errorVals = ErrorBars.calcFromTrace(options, scene.fullLayout); @@ -375,8 +378,8 @@ proto.updateFancy = function(options) { var i, j, xx, yy, ex0, ex1, ey0, ey1; for(i = 0; i < len; ++i) { - xx = getX(x[i]); - yy = getY(y[i]); + this.xData[i] = xx = getX(x[i]); + this.yData[i] = yy = getY(y[i]); if(isNaN(xx) || isNaN(yy)) continue; From 4aa202a6e7b3d4f4e74b842f5b3047e412bcc14d Mon Sep 17 00:00:00 2001 From: mikolalysenko Date: Wed, 4 May 2016 10:27:33 -0700 Subject: [PATCH 4/4] use separate xdata/ydata for picking in scatter plots --- src/traces/scattergl/convert.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index 88949a1f146..36ef0556dca 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -33,6 +33,8 @@ function LineWithMarkers(scene, uid) { this.scene = scene; this.uid = uid; + this.pickXData = []; + this.pickYData = []; this.xData = []; this.yData = []; this.textLabels = []; @@ -113,8 +115,8 @@ proto.handlePick = function(pickResult) { trace: this, dataCoord: pickResult.dataCoord, traceCoord: [ - this.xData[index], - this.yData[index] + this.pickXData[index], + this.pickYData[index] ], textLabel: Array.isArray(this.textLabels) ? this.textLabels[index] : @@ -267,8 +269,8 @@ proto.update = function(options) { }; proto.updateFast = function(options) { - var x = this.xData = options.x; - var y = this.yData = options.y; + var x = this.xData = this.pickXData = options.x; + var y = this.yData = this.pickYData = options.y; var len = x.length, idToIndex = new Array(len), @@ -349,8 +351,8 @@ proto.updateFancy = function(options) { bounds = this.bounds; // makeCalcdata runs d2c (data-to-coordinate) on every point - var x = xaxis.makeCalcdata(options, 'x').slice(); - var y = yaxis.makeCalcdata(options, 'y').slice(); + var x = this.pickXData = xaxis.makeCalcdata(options, 'x').slice(); + var y = this.pickYData = yaxis.makeCalcdata(options, 'y').slice(); this.xData = x.slice(); this.yData = y.slice();