Skip to content

Commit 82290a2

Browse files
committed
replace calcFromTrace wrapper with more direct computeError routine
- this should be a performance boost as we no longer mock calcdata item
1 parent 8837b2e commit 82290a2

File tree

2 files changed

+50
-55
lines changed

2 files changed

+50
-55
lines changed

src/components/errorbars/index.js

-25
Original file line numberDiff line numberDiff line change
@@ -49,37 +49,12 @@ module.exports = {
4949
supplyDefaults: require('./defaults'),
5050

5151
calc: calc,
52-
calcFromTrace: calcFromTrace,
5352

5453
plot: require('./plot'),
5554
style: require('./style'),
5655
hoverInfo: hoverInfo
5756
};
5857

59-
function calcFromTrace(trace, layout) {
60-
var x = trace.x || [],
61-
y = trace.y || [],
62-
len = x.length || y.length;
63-
64-
var calcdataMock = new Array(len);
65-
66-
for(var i = 0; i < len; i++) {
67-
calcdataMock[i] = {
68-
x: x[i],
69-
y: y[i]
70-
};
71-
}
72-
73-
calcdataMock[0].trace = trace;
74-
75-
calc({
76-
calcdata: [calcdataMock],
77-
_fullLayout: layout
78-
});
79-
80-
return calcdataMock;
81-
}
82-
8358
function hoverInfo(calcPoint, trace, hoverPoint) {
8459
if((trace.error_y || {}).visible) {
8560
hoverPoint.yerr = calcPoint.yh - calcPoint.y;

src/traces/scattergl/convert.js

+50-30
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@
88

99
'use strict';
1010

11+
var isNumeric = require('fast-isnumeric');
1112
var svgSdf = require('svg-path-sdf');
1213
var rgba = require('color-normalize');
1314

1415
var Registry = require('../../registry');
1516
var Lib = require('../../lib');
1617
var Drawing = require('../../components/drawing');
18+
var Axes = require('../../plots/cartesian/axes');
1719
var AxisIDs = require('../../plots/cartesian/axis_ids');
1820

1921
var formatColor = require('../../lib/gl_format_color').formatColor;
2022
var subTypes = require('../scatter/subtypes');
2123
var makeBubbleSizeFn = require('../scatter/make_bubble_size_func');
24+
var makeComputeError = require('../../components/errorbars/compute_error');
2225

2326
var constants = require('./constants');
2427
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
@@ -360,42 +363,59 @@ function convertLinePositions(gd, trace, positions) {
360363
};
361364
}
362365

363-
function convertErrorBarPositions(gd, trace, pos, x, y) {
364-
var calcFromTrace = Registry.getComponentMethod('errorbars', 'calcFromTrace');
365-
var _trace = Lib.extendFlat({}, trace, {x: x, y: y});
366-
var vals = calcFromTrace(_trace, gd._fullLayout);
367-
var count = pos.length / 2;
366+
function convertErrorBarPositions(gd, trace, positions, x, y) {
367+
var xa = AxisIDs.getFromId(gd, trace.xaxis);
368+
var ya = AxisIDs.getFromId(gd, trace.yaxis);
369+
var count = positions.length / 2;
368370
var out = {};
369371

370-
function put(axLetter) {
371-
var errors = new Float64Array(4 * count);
372-
var ax = AxisIDs.getFromId(gd, trace[axLetter + 'axis']);
373-
var pOffset = {x: 0, y: 1}[axLetter];
374-
var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter];
375-
376-
for(var i = 0, p = 0; i < count; i++, p += 4) {
377-
errors[p + eOffset[0]] = pos[i * 2 + pOffset] - ax.c2l(vals[i][axLetter + 's']) || 0;
378-
errors[p + eOffset[1]] = ax.c2l(vals[i][axLetter + 'h']) - pos[i * 2 + pOffset] || 0;
379-
errors[p + eOffset[2]] = 0;
380-
errors[p + eOffset[3]] = 0;
381-
}
372+
function convertOneAxis(coords, ax) {
373+
var axLetter = ax._id.charAt(0);
374+
var opts = trace['error_' + axLetter];
375+
376+
if(opts && opts.visible && (ax.type === 'linear' || ax.type === 'log')) {
377+
var computeError = makeComputeError(trace['error_' + axLetter]);
378+
var pOffset = {x: 0, y: 1}[axLetter];
379+
var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter];
380+
var errors = new Float64Array(4 * count);
381+
var minShoe = Infinity;
382+
var maxHat = -Infinity;
383+
384+
for(var i = 0, j = 0; i < count; i++, j += 4) {
385+
var dc = coords[i];
386+
387+
if(isNumeric(dc)) {
388+
var dl = positions[i * 2 + pOffset];
389+
var vals = computeError(dc, i);
390+
var lv = vals[0];
391+
var hv = vals[1];
392+
393+
if(isNumeric(lv) && isNumeric(hv)) {
394+
var shoe = dc - lv;
395+
var hat = dc + hv;
396+
397+
errors[j + eOffset[0]] = dl - ax.c2l(shoe);
398+
errors[j + eOffset[1]] = ax.c2l(hat) - dl;
399+
errors[j + eOffset[2]] = 0;
400+
errors[j + eOffset[3]] = 0;
401+
402+
minShoe = Math.min(minShoe, dc - lv);
403+
maxHat = Math.max(maxHat, dc + hv);
404+
}
405+
}
406+
}
382407

383-
return errors;
384-
}
408+
Axes.expand(ax, [minShoe, maxHat], {padded: true});
385409

386-
if(trace.error_x && trace.error_x.visible) {
387-
out.x = {
388-
positions: pos,
389-
errors: put('x')
390-
};
391-
}
392-
if(trace.error_y && trace.error_y.visible) {
393-
out.y = {
394-
positions: pos,
395-
errors: put('y')
396-
};
410+
out[axLetter] = {
411+
positions: positions,
412+
errors: errors
413+
};
414+
}
397415
}
398416

417+
convertOneAxis(x, xa);
418+
convertOneAxis(y, ya);
399419
return out;
400420
}
401421

0 commit comments

Comments
 (0)