Skip to content

Commit 82326ba

Browse files
authored
Merge pull request #2162 from plotly/more-indexToPoints
More indexToPoints
2 parents 51fcb2e + 8de50dc commit 82326ba

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed

src/transforms/groupby.js

+13
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
var Lib = require('../lib');
1212
var PlotSchema = require('../plot_api/plot_schema');
1313
var Plots = require('../plots/plots');
14+
var pointsAccessorFunction = require('./helpers').pointsAccessorFunction;
1415

1516
exports.moduleType = 'transform';
1617

@@ -161,6 +162,7 @@ function transformOne(trace, state) {
161162

162163
var opts = state.transform;
163164
var groups = trace.transforms[state.transformIndex].groups;
165+
var originalPointsAccessor = pointsAccessorFunction(trace.transforms, opts);
164166

165167
if(!(Array.isArray(groups)) || groups.length === 0) {
166168
return [trace];
@@ -184,14 +186,17 @@ function transformOne(trace, state) {
184186

185187
// An index to map group name --> expanded trace index
186188
var indexLookup = {};
189+
var indexCnts = {};
187190

188191
for(i = 0; i < groupNames.length; i++) {
189192
groupName = groupNames[i];
190193
indexLookup[groupName] = i;
194+
indexCnts[groupName] = 0;
191195

192196
// Start with a deep extend that just copies array references.
193197
newTrace = newData[i] = Lib.extendDeepNoArrays({}, trace);
194198
newTrace._group = groupName;
199+
newTrace.transforms[state.transformIndex]._indexToPoints = {};
195200

196201
var suppliedName = null;
197202
if(groupNameObj) {
@@ -246,6 +251,14 @@ function transformOne(trace, state) {
246251
}
247252
}
248253

254+
for(j = 0; j < len; j++) {
255+
newTrace = newData[indexLookup[groups[j]]];
256+
257+
var indexToPoints = newTrace.transforms[state.transformIndex]._indexToPoints;
258+
indexToPoints[indexCnts[groups[j]]] = originalPointsAccessor(j);
259+
indexCnts[groups[j]]++;
260+
}
261+
249262
for(i = 0; i < groupNames.length; i++) {
250263
groupName = groupNames[i];
251264
newTrace = newData[i];

src/transforms/sort.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
var Lib = require('../lib');
1212
var Axes = require('../plots/cartesian/axes');
13+
var pointsAccessorFunction = require('./helpers').pointsAccessorFunction;
1314

1415
exports.moduleType = 'transform';
1516

@@ -87,18 +88,27 @@ exports.calcTransform = function(gd, trace, opts) {
8788
var arrayAttrs = trace._arrayAttrs;
8889
var d2c = Axes.getDataToCoordFunc(gd, trace, target, targetArray);
8990
var indices = getIndices(opts, targetArray, d2c);
91+
var originalPointsAccessor = pointsAccessorFunction(trace.transforms, opts);
92+
var indexToPoints = {};
93+
var i, j;
9094

91-
for(var i = 0; i < arrayAttrs.length; i++) {
95+
for(i = 0; i < arrayAttrs.length; i++) {
9296
var np = Lib.nestedProperty(trace, arrayAttrs[i]);
9397
var arrayOld = np.get();
9498
var arrayNew = new Array(len);
9599

96-
for(var j = 0; j < len; j++) {
100+
for(j = 0; j < len; j++) {
97101
arrayNew[j] = arrayOld[indices[j]];
98102
}
99103

100104
np.set(arrayNew);
101105
}
106+
107+
for(j = 0; j < len; j++) {
108+
indexToPoints[j] = originalPointsAccessor(indices[j]);
109+
}
110+
111+
opts._indexToPoints = indexToPoints;
102112
};
103113

104114
function getIndices(opts, targetArray, d2c) {

test/jasmine/tests/transform_groupby_test.js

+3
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ describe('groupby', function() {
5757
expect(gd._fullData.length).toEqual(2);
5858
expect(gd._fullData[0].x).toEqual([1, -1, 0, 3]);
5959
expect(gd._fullData[0].y).toEqual([1, 2, 1, 1]);
60+
expect(gd._fullData[0].transforms[0]._indexToPoints).toEqual({0: [0], 1: [1], 2: [3], 3: [6]});
6061
expect(gd._fullData[1].x).toEqual([-2, 1, 2]);
6162
expect(gd._fullData[1].y).toEqual([3, 2, 3]);
63+
expect(gd._fullData[1].transforms[0]._indexToPoints).toEqual({0: [2], 1: [4], 2: [5]});
6264

6365
assertDims([4, 3]);
6466

@@ -460,6 +462,7 @@ describe('groupby', function() {
460462
expect(gd._fullData[0].y).toEqual([0, 1, 3, 6]);
461463
expect(gd._fullData[0].marker.line.width).toEqual([4, 2, 2, 3]);
462464

465+
463466
expect(gd._fullData[1].ids).toEqual(['r', 'y', 'u']);
464467
expect(gd._fullData[1].x).toEqual([-2, 1, 2]);
465468
expect(gd._fullData[1].y).toEqual([2, 5, 4]);

test/jasmine/tests/transform_sort_test.js

+27
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@ describe('Test sort transform calc:', function() {
9090
expect(out[0].ids).toEqual(['n0', 'n2', 'n1', 'z', 'p1', 'p3', 'p2']);
9191
expect(out[0].marker.color).toEqual([0.1, 0.3, 0.2, 0.1, 0.2, 0.4, 0.3]);
9292
expect(out[0].marker.size).toEqual([10, 5, 20, 1, 6, 10, 0]);
93+
expect(out[0].transforms[0]._indexToPoints).toEqual({
94+
0: [0],
95+
1: [2],
96+
2: [1],
97+
3: [3],
98+
4: [4],
99+
5: [6],
100+
6: [5]
101+
});
93102
});
94103

95104
it('should sort all array attributes (descending case)', function() {
@@ -104,6 +113,15 @@ describe('Test sort transform calc:', function() {
104113
expect(out[0].ids).toEqual(['p2', 'p1', 'p3', 'z', 'n1', 'n0', 'n2']);
105114
expect(out[0].marker.color).toEqual([0.3, 0.2, 0.4, 0.1, 0.2, 0.1, 0.3]);
106115
expect(out[0].marker.size).toEqual([0, 6, 10, 1, 20, 10, 5]);
116+
expect(out[0].transforms[0]._indexToPoints).toEqual({
117+
0: [5],
118+
1: [4],
119+
2: [6],
120+
3: [3],
121+
4: [1],
122+
5: [0],
123+
6: [2]
124+
});
107125
});
108126

109127
it('should sort via nested targets', function() {
@@ -119,6 +137,15 @@ describe('Test sort transform calc:', function() {
119137
expect(out[0].ids).toEqual(['n1', 'n0', 'p3', 'p1', 'n2', 'z', 'p2']);
120138
expect(out[0].marker.color).toEqual([0.2, 0.1, 0.4, 0.2, 0.3, 0.1, 0.3]);
121139
expect(out[0].marker.size).toEqual([20, 10, 10, 6, 5, 1, 0]);
140+
expect(out[0].transforms[0]._indexToPoints).toEqual({
141+
0: [1],
142+
1: [0],
143+
2: [6],
144+
3: [4],
145+
4: [2],
146+
5: [3],
147+
6: [5]
148+
});
122149
});
123150

124151
it('should sort via dates targets', function() {

0 commit comments

Comments
 (0)