diff --git a/src/transforms/groupby.js b/src/transforms/groupby.js index 3b90ea562ae..cd627ab70ef 100644 --- a/src/transforms/groupby.js +++ b/src/transforms/groupby.js @@ -11,6 +11,7 @@ var Lib = require('../lib'); var PlotSchema = require('../plot_api/plot_schema'); var Plots = require('../plots/plots'); +var pointsAccessorFunction = require('./helpers').pointsAccessorFunction; exports.moduleType = 'transform'; @@ -161,6 +162,7 @@ function transformOne(trace, state) { var opts = state.transform; var groups = trace.transforms[state.transformIndex].groups; + var originalPointsAccessor = pointsAccessorFunction(trace.transforms, opts); if(!(Array.isArray(groups)) || groups.length === 0) { return [trace]; @@ -184,14 +186,17 @@ function transformOne(trace, state) { // An index to map group name --> expanded trace index var indexLookup = {}; + var indexCnts = {}; for(i = 0; i < groupNames.length; i++) { groupName = groupNames[i]; indexLookup[groupName] = i; + indexCnts[groupName] = 0; // Start with a deep extend that just copies array references. newTrace = newData[i] = Lib.extendDeepNoArrays({}, trace); newTrace._group = groupName; + newTrace.transforms[state.transformIndex]._indexToPoints = {}; var suppliedName = null; if(groupNameObj) { @@ -246,6 +251,14 @@ function transformOne(trace, state) { } } + for(j = 0; j < len; j++) { + newTrace = newData[indexLookup[groups[j]]]; + + var indexToPoints = newTrace.transforms[state.transformIndex]._indexToPoints; + indexToPoints[indexCnts[groups[j]]] = originalPointsAccessor(j); + indexCnts[groups[j]]++; + } + for(i = 0; i < groupNames.length; i++) { groupName = groupNames[i]; newTrace = newData[i]; diff --git a/src/transforms/sort.js b/src/transforms/sort.js index 9dc082b492c..b2d13d3abeb 100644 --- a/src/transforms/sort.js +++ b/src/transforms/sort.js @@ -10,6 +10,7 @@ var Lib = require('../lib'); var Axes = require('../plots/cartesian/axes'); +var pointsAccessorFunction = require('./helpers').pointsAccessorFunction; exports.moduleType = 'transform'; @@ -87,18 +88,27 @@ exports.calcTransform = function(gd, trace, opts) { var arrayAttrs = trace._arrayAttrs; var d2c = Axes.getDataToCoordFunc(gd, trace, target, targetArray); var indices = getIndices(opts, targetArray, d2c); + var originalPointsAccessor = pointsAccessorFunction(trace.transforms, opts); + var indexToPoints = {}; + var i, j; - for(var i = 0; i < arrayAttrs.length; i++) { + for(i = 0; i < arrayAttrs.length; i++) { var np = Lib.nestedProperty(trace, arrayAttrs[i]); var arrayOld = np.get(); var arrayNew = new Array(len); - for(var j = 0; j < len; j++) { + for(j = 0; j < len; j++) { arrayNew[j] = arrayOld[indices[j]]; } np.set(arrayNew); } + + for(j = 0; j < len; j++) { + indexToPoints[j] = originalPointsAccessor(indices[j]); + } + + opts._indexToPoints = indexToPoints; }; function getIndices(opts, targetArray, d2c) { diff --git a/test/jasmine/tests/transform_groupby_test.js b/test/jasmine/tests/transform_groupby_test.js index cc83d4b87d9..d55ab8bf58d 100644 --- a/test/jasmine/tests/transform_groupby_test.js +++ b/test/jasmine/tests/transform_groupby_test.js @@ -57,8 +57,10 @@ describe('groupby', function() { expect(gd._fullData.length).toEqual(2); expect(gd._fullData[0].x).toEqual([1, -1, 0, 3]); expect(gd._fullData[0].y).toEqual([1, 2, 1, 1]); + expect(gd._fullData[0].transforms[0]._indexToPoints).toEqual({0: [0], 1: [1], 2: [3], 3: [6]}); expect(gd._fullData[1].x).toEqual([-2, 1, 2]); expect(gd._fullData[1].y).toEqual([3, 2, 3]); + expect(gd._fullData[1].transforms[0]._indexToPoints).toEqual({0: [2], 1: [4], 2: [5]}); assertDims([4, 3]); @@ -460,6 +462,7 @@ describe('groupby', function() { expect(gd._fullData[0].y).toEqual([0, 1, 3, 6]); expect(gd._fullData[0].marker.line.width).toEqual([4, 2, 2, 3]); + expect(gd._fullData[1].ids).toEqual(['r', 'y', 'u']); expect(gd._fullData[1].x).toEqual([-2, 1, 2]); expect(gd._fullData[1].y).toEqual([2, 5, 4]); diff --git a/test/jasmine/tests/transform_sort_test.js b/test/jasmine/tests/transform_sort_test.js index 108e04f7d56..cddb44a7acc 100644 --- a/test/jasmine/tests/transform_sort_test.js +++ b/test/jasmine/tests/transform_sort_test.js @@ -90,6 +90,15 @@ describe('Test sort transform calc:', function() { expect(out[0].ids).toEqual(['n0', 'n2', 'n1', 'z', 'p1', 'p3', 'p2']); expect(out[0].marker.color).toEqual([0.1, 0.3, 0.2, 0.1, 0.2, 0.4, 0.3]); expect(out[0].marker.size).toEqual([10, 5, 20, 1, 6, 10, 0]); + expect(out[0].transforms[0]._indexToPoints).toEqual({ + 0: [0], + 1: [2], + 2: [1], + 3: [3], + 4: [4], + 5: [6], + 6: [5] + }); }); it('should sort all array attributes (descending case)', function() { @@ -104,6 +113,15 @@ describe('Test sort transform calc:', function() { expect(out[0].ids).toEqual(['p2', 'p1', 'p3', 'z', 'n1', 'n0', 'n2']); expect(out[0].marker.color).toEqual([0.3, 0.2, 0.4, 0.1, 0.2, 0.1, 0.3]); expect(out[0].marker.size).toEqual([0, 6, 10, 1, 20, 10, 5]); + expect(out[0].transforms[0]._indexToPoints).toEqual({ + 0: [5], + 1: [4], + 2: [6], + 3: [3], + 4: [1], + 5: [0], + 6: [2] + }); }); it('should sort via nested targets', function() { @@ -119,6 +137,15 @@ describe('Test sort transform calc:', function() { expect(out[0].ids).toEqual(['n1', 'n0', 'p3', 'p1', 'n2', 'z', 'p2']); expect(out[0].marker.color).toEqual([0.2, 0.1, 0.4, 0.2, 0.3, 0.1, 0.3]); expect(out[0].marker.size).toEqual([20, 10, 10, 6, 5, 1, 0]); + expect(out[0].transforms[0]._indexToPoints).toEqual({ + 0: [1], + 1: [0], + 2: [6], + 3: [4], + 4: [2], + 5: [3], + 6: [5] + }); }); it('should sort via dates targets', function() {