From 2f4786db4b6ce86fcb16fd07fd2539348cb48e8e Mon Sep 17 00:00:00 2001 From: etienne Date: Tue, 8 May 2018 17:33:03 -0400 Subject: [PATCH 1/5] fix errorbar when coord input arrays differ from their calc arrays - for example, when 'x' array is given (i.e. the x0/dx case) or when numeric string are inputted. --- src/traces/scattergl/convert.js | 16 ++++++++-------- src/traces/scattergl/index.js | 6 +++--- test/image/baselines/gl2d_error_bars.png | Bin 22901 -> 26313 bytes test/image/mocks/gl2d_error_bars.json | 23 +++++++++++++++++++++++ 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index b1dbce3df12..69c0937105d 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -360,10 +360,11 @@ function convertLinePositions(gd, trace, positions) { }; } -function convertErrorBarPositions(gd, trace, positions) { +function convertErrorBarPositions(gd, trace, pos, x, y) { var calcFromTrace = Registry.getComponentMethod('errorbars', 'calcFromTrace'); - var vals = calcFromTrace(trace, gd._fullLayout); - var count = positions.length / 2; + var _trace = Lib.extendFlat({}, trace, {x: x, y: y}); + var vals = calcFromTrace(_trace, gd._fullLayout); + var count = pos.length / 2; var out = {}; function put(axLetter) { @@ -373,8 +374,8 @@ function convertErrorBarPositions(gd, trace, positions) { var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter]; for(var i = 0, p = 0; i < count; i++, p += 4) { - errors[p + eOffset[0]] = positions[i * 2 + pOffset] - ax.d2l(vals[i][axLetter + 's']) || 0; - errors[p + eOffset[1]] = ax.d2l(vals[i][axLetter + 'h']) - positions[i * 2 + pOffset] || 0; + errors[p + eOffset[0]] = pos[i * 2 + pOffset] - ax.c2l(vals[i][axLetter + 's']) || 0; + errors[p + eOffset[1]] = ax.c2l(vals[i][axLetter + 'h']) - pos[i * 2 + pOffset] || 0; errors[p + eOffset[2]] = 0; errors[p + eOffset[3]] = 0; } @@ -382,16 +383,15 @@ function convertErrorBarPositions(gd, trace, positions) { return errors; } - if(trace.error_x && trace.error_x.visible) { out.x = { - positions: positions, + positions: pos, errors: put('x') }; } if(trace.error_y && trace.error_y.visible) { out.y = { - positions: positions, + positions: pos, errors: put('y') }; } diff --git a/src/traces/scattergl/index.js b/src/traces/scattergl/index.js index d75ae2ca79a..934b60c9ca8 100644 --- a/src/traces/scattergl/index.js +++ b/src/traces/scattergl/index.js @@ -82,7 +82,7 @@ function calc(gd, trace) { // create scene options and scene calcColorscales(trace); - var opts = sceneOptions(gd, subplot, trace, positions); + var opts = sceneOptions(gd, subplot, trace, positions, x, y); var scene = sceneUpdate(gd, subplot); // Re-use SVG scatter axis expansion routine except @@ -133,7 +133,7 @@ function calc(gd, trace) { } // create scene options -function sceneOptions(gd, subplot, trace, positions) { +function sceneOptions(gd, subplot, trace, positions, x, y) { var opts = convertStyle(gd, trace); if(opts.marker) { @@ -148,7 +148,7 @@ function sceneOptions(gd, subplot, trace, positions) { } if(opts.errorX || opts.errorY) { - var errors = convertErrorBarPositions(gd, trace, positions); + var errors = convertErrorBarPositions(gd, trace, positions, x, y); if(opts.errorX) { Lib.extendFlat(opts.errorX, errors.x); diff --git a/test/image/baselines/gl2d_error_bars.png b/test/image/baselines/gl2d_error_bars.png index b48fcb35bba2107be8fa3fa21b9d8ab6473dbc0b..21605d8215f67bb287c6d07420b9fed945f1b387 100644 GIT binary patch literal 26313 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 qt)Cy&!~cAVKlb_kKNBD})hh(W+0;5`* Date: Tue, 22 May 2018 11:06:47 -0400 Subject: [PATCH 2/5] replace calcFromTrace wrapper with more direct computeError routine - this should be a performance boost as we no longer mock calcdata item --- src/components/errorbars/index.js | 25 ---------- src/traces/scattergl/convert.js | 80 +++++++++++++++++++------------ 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/src/components/errorbars/index.js b/src/components/errorbars/index.js index 59c223c443d..781305c7370 100644 --- a/src/components/errorbars/index.js +++ b/src/components/errorbars/index.js @@ -49,37 +49,12 @@ module.exports = { supplyDefaults: require('./defaults'), calc: calc, - calcFromTrace: calcFromTrace, plot: require('./plot'), style: require('./style'), hoverInfo: hoverInfo }; -function calcFromTrace(trace, layout) { - var x = trace.x || [], - y = trace.y || [], - len = x.length || y.length; - - var calcdataMock = new Array(len); - - for(var i = 0; i < len; i++) { - calcdataMock[i] = { - x: x[i], - y: y[i] - }; - } - - calcdataMock[0].trace = trace; - - calc({ - calcdata: [calcdataMock], - _fullLayout: layout - }); - - return calcdataMock; -} - function hoverInfo(calcPoint, trace, hoverPoint) { if((trace.error_y || {}).visible) { hoverPoint.yerr = calcPoint.yh - calcPoint.y; diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index 4f7fd6fd842..52ec908f86b 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -8,17 +8,20 @@ 'use strict'; +var isNumeric = require('fast-isnumeric'); var svgSdf = require('svg-path-sdf'); var rgba = require('color-normalize'); var Registry = require('../../registry'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); +var Axes = require('../../plots/cartesian/axes'); var AxisIDs = require('../../plots/cartesian/axis_ids'); var formatColor = require('../../lib/gl_format_color').formatColor; var subTypes = require('../scatter/subtypes'); var makeBubbleSizeFn = require('../scatter/make_bubble_size_func'); +var makeComputeError = require('../../components/errorbars/compute_error'); var constants = require('./constants'); var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; @@ -360,42 +363,59 @@ function convertLinePositions(gd, trace, positions) { }; } -function convertErrorBarPositions(gd, trace, pos, x, y) { - var calcFromTrace = Registry.getComponentMethod('errorbars', 'calcFromTrace'); - var _trace = Lib.extendFlat({}, trace, {x: x, y: y}); - var vals = calcFromTrace(_trace, gd._fullLayout); - var count = pos.length / 2; +function convertErrorBarPositions(gd, trace, positions, x, y) { + var xa = AxisIDs.getFromId(gd, trace.xaxis); + var ya = AxisIDs.getFromId(gd, trace.yaxis); + var count = positions.length / 2; var out = {}; - function put(axLetter) { - var errors = new Float64Array(4 * count); - var ax = AxisIDs.getFromId(gd, trace[axLetter + 'axis']); - var pOffset = {x: 0, y: 1}[axLetter]; - var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter]; - - for(var i = 0, p = 0; i < count; i++, p += 4) { - errors[p + eOffset[0]] = pos[i * 2 + pOffset] - ax.c2l(vals[i][axLetter + 's']) || 0; - errors[p + eOffset[1]] = ax.c2l(vals[i][axLetter + 'h']) - pos[i * 2 + pOffset] || 0; - errors[p + eOffset[2]] = 0; - errors[p + eOffset[3]] = 0; - } + function convertOneAxis(coords, ax) { + var axLetter = ax._id.charAt(0); + var opts = trace['error_' + axLetter]; + + if(opts && opts.visible && (ax.type === 'linear' || ax.type === 'log')) { + var computeError = makeComputeError(trace['error_' + axLetter]); + var pOffset = {x: 0, y: 1}[axLetter]; + var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter]; + var errors = new Float64Array(4 * count); + var minShoe = Infinity; + var maxHat = -Infinity; + + for(var i = 0, j = 0; i < count; i++, j += 4) { + var dc = coords[i]; + + if(isNumeric(dc)) { + var dl = positions[i * 2 + pOffset]; + var vals = computeError(dc, i); + var lv = vals[0]; + var hv = vals[1]; + + if(isNumeric(lv) && isNumeric(hv)) { + var shoe = dc - lv; + var hat = dc + hv; + + errors[j + eOffset[0]] = dl - ax.c2l(shoe); + errors[j + eOffset[1]] = ax.c2l(hat) - dl; + errors[j + eOffset[2]] = 0; + errors[j + eOffset[3]] = 0; + + minShoe = Math.min(minShoe, dc - lv); + maxHat = Math.max(maxHat, dc + hv); + } + } + } - return errors; - } + Axes.expand(ax, [minShoe, maxHat], {padded: true}); - if(trace.error_x && trace.error_x.visible) { - out.x = { - positions: pos, - errors: put('x') - }; - } - if(trace.error_y && trace.error_y.visible) { - out.y = { - positions: pos, - errors: put('y') - }; + out[axLetter] = { + positions: positions, + errors: errors + }; + } } + convertOneAxis(x, xa); + convertOneAxis(y, ya); return out; } From ded2f5688975a87a3b634daa8e602de3b821fbaa Mon Sep 17 00:00:00 2001 From: etienne Date: Tue, 22 May 2018 11:12:21 -0400 Subject: [PATCH 3/5] add makeComputeError to errorbars module, call it w/ Registry --- src/components/errorbars/index.js | 4 ++-- src/traces/scatter3d/calc_errors.js | 5 ++--- src/traces/scattergl/convert.js | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/errorbars/index.js b/src/components/errorbars/index.js index 781305c7370..0a87b900d14 100644 --- a/src/components/errorbars/index.js +++ b/src/components/errorbars/index.js @@ -12,7 +12,6 @@ var Lib = require('../../lib'); var overrideAll = require('../../plot_api/edit_types').overrideAll; var attributes = require('./attributes'); -var calc = require('./calc'); var xyAttrs = { error_x: Lib.extendFlat({}, attributes), @@ -48,7 +47,8 @@ module.exports = { supplyDefaults: require('./defaults'), - calc: calc, + calc: require('./calc'), + makeComputeError: require('./compute_error'), plot: require('./plot'), style: require('./style'), diff --git a/src/traces/scatter3d/calc_errors.js b/src/traces/scatter3d/calc_errors.js index ecc1f8ee87d..221d26b55e6 100644 --- a/src/traces/scatter3d/calc_errors.js +++ b/src/traces/scatter3d/calc_errors.js @@ -6,15 +6,14 @@ * LICENSE file in the root directory of this source tree. */ - 'use strict'; -var makeComputeError = require('../../components/errorbars/compute_error'); +var Registry = require('../../registry'); function calculateAxisErrors(data, params, scaleFactor) { if(!params || !params.visible) return null; - var computeError = makeComputeError(params); + var computeError = Registry.getComponentMethod('errorbars', 'makeComputeError')(params); var result = new Array(data.length); for(var i = 0; i < data.length; i++) { diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index 52ec908f86b..e8c7eea5f50 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -21,7 +21,6 @@ var AxisIDs = require('../../plots/cartesian/axis_ids'); var formatColor = require('../../lib/gl_format_color').formatColor; var subTypes = require('../scatter/subtypes'); var makeBubbleSizeFn = require('../scatter/make_bubble_size_func'); -var makeComputeError = require('../../components/errorbars/compute_error'); var constants = require('./constants'); var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; @@ -364,6 +363,7 @@ function convertLinePositions(gd, trace, positions) { } function convertErrorBarPositions(gd, trace, positions, x, y) { + var makeComputeError = Registry.getComponentMethod('errorbars', 'makeComputeError'); var xa = AxisIDs.getFromId(gd, trace.xaxis); var ya = AxisIDs.getFromId(gd, trace.yaxis); var count = positions.length / 2; From c1b1730bbd8580498ed606e71845233b959676c6 Mon Sep 17 00:00:00 2001 From: etienne Date: Tue, 22 May 2018 11:12:49 -0400 Subject: [PATCH 4/5] add percent error bar to gl2d log error bar mock --- test/image/baselines/gl2d_error_bars_log.png | Bin 21058 -> 21050 bytes test/image/mocks/gl2d_error_bars_log.json | 10 +++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/test/image/baselines/gl2d_error_bars_log.png b/test/image/baselines/gl2d_error_bars_log.png index 26cc4c4c47295885017dc899fced82b1476ebce1..066c3468480701a5399e1a31d0534cac4216fc20 100644 GIT binary patch literal 21050 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

k+j{3vbh6>>@+J44^9`O53%1Vz2 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 MWu%#}e(Li71MWt4n*aa+ diff --git a/test/image/mocks/gl2d_error_bars_log.json b/test/image/mocks/gl2d_error_bars_log.json index 02471ffbba1..8a134971118 100644 --- a/test/image/mocks/gl2d_error_bars_log.json +++ b/test/image/mocks/gl2d_error_bars_log.json @@ -1,10 +1,18 @@ { "data": [{ + "name": "array error bars", "type": "scattergl", "y": [10, 2e4, 5e6], "error_y": {"array": [5, 1e4, 4e6]} + }, { + "name": "50% percent error bars", + "type": "scattergl", + "x0": 0.2, + "y": [10, 2e4, 5e6], + "error_y": {"type": "percent", "value": 50} }], "layout": { - "yaxis": {"type": "log"} + "yaxis": {"type": "log"}, + "showlegend": false } } From 7e77bb46b18763ce472277cffd40fc57c04c72f5 Mon Sep 17 00:00:00 2001 From: etienne Date: Tue, 22 May 2018 12:38:47 -0400 Subject: [PATCH 5/5] :palm_tree: convertErrorBarPositions --- src/traces/scattergl/convert.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index e8c7eea5f50..83788abe95a 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -374,7 +374,7 @@ function convertErrorBarPositions(gd, trace, positions, x, y) { var opts = trace['error_' + axLetter]; if(opts && opts.visible && (ax.type === 'linear' || ax.type === 'log')) { - var computeError = makeComputeError(trace['error_' + axLetter]); + var computeError = makeComputeError(opts); var pOffset = {x: 0, y: 1}[axLetter]; var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter]; var errors = new Float64Array(4 * count);