Skip to content

Commit 5ccc83d

Browse files
authored
Merge pull request #2677 from plotly/scattergl-transform-fixes
Scattergl transform fixes
2 parents b042f93 + 86d6a95 commit 5ccc83d

File tree

10 files changed

+303
-29
lines changed

10 files changed

+303
-29
lines changed

src/lib/index.js

+36-7
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,17 @@ lib.extractOption = function(calcPt, trace, calcKey, traceKey) {
478478
if(!Array.isArray(traceVal)) return traceVal;
479479
};
480480

481+
function makePtIndex2PtNumber(indexToPoints) {
482+
var ptIndex2ptNumber = {};
483+
for(var k in indexToPoints) {
484+
var pts = indexToPoints[k];
485+
for(var j = 0; j < pts.length; j++) {
486+
ptIndex2ptNumber[pts[j]] = +k;
487+
}
488+
}
489+
return ptIndex2ptNumber;
490+
}
491+
481492
/** Tag selected calcdata items
482493
*
483494
* N.B. note that point 'index' corresponds to input data array index
@@ -498,13 +509,7 @@ lib.tagSelected = function(calcTrace, trace, ptNumber2cdIndex) {
498509

499510
// make pt index-to-number map object, which takes care of transformed traces
500511
if(indexToPoints) {
501-
ptIndex2ptNumber = {};
502-
for(var k in indexToPoints) {
503-
var pts = indexToPoints[k];
504-
for(var j = 0; j < pts.length; j++) {
505-
ptIndex2ptNumber[pts[j]] = k;
506-
}
507-
}
512+
ptIndex2ptNumber = makePtIndex2PtNumber(indexToPoints);
508513
}
509514

510515
function isCdIndexValid(v) {
@@ -525,6 +530,30 @@ lib.tagSelected = function(calcTrace, trace, ptNumber2cdIndex) {
525530
}
526531
};
527532

533+
lib.selIndices2selPoints = function(trace) {
534+
var selectedpoints = trace.selectedpoints;
535+
var indexToPoints = trace._indexToPoints;
536+
537+
if(indexToPoints) {
538+
var ptIndex2ptNumber = makePtIndex2PtNumber(indexToPoints);
539+
var out = [];
540+
541+
for(var i = 0; i < selectedpoints.length; i++) {
542+
var ptIndex = selectedpoints[i];
543+
if(lib.isIndex(ptIndex)) {
544+
var ptNumber = ptIndex2ptNumber[ptIndex];
545+
if(lib.isIndex(ptNumber)) {
546+
out.push(ptNumber);
547+
}
548+
}
549+
}
550+
551+
return out;
552+
} else {
553+
return selectedpoints;
554+
}
555+
};
556+
528557
/** Returns target as set by 'target' transform attribute
529558
*
530559
* @param {object} trace : full trace object

src/plots/plots.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -2342,7 +2342,15 @@ plots.doCalcdata = function(gd, traces) {
23422342
// we need one round of trace module calc before
23432343
// the calc transform to 'fill in' the categories list
23442344
// used for example in the data-to-coordinate method
2345-
if(_module && _module.calc) _module.calc(gd, trace);
2345+
if(_module && _module.calc) {
2346+
var cdi = _module.calc(gd, trace);
2347+
2348+
// must clear scene 'batches', so that 2nd
2349+
// _module.calc call starts from scratch
2350+
if(cdi[0] && cdi[0].t && cdi[0].t._scene) {
2351+
delete cdi[0].t._scene.dirty;
2352+
}
2353+
}
23462354

23472355
for(j = 0; j < trace.transforms.length; j++) {
23482356
var transform = trace.transforms[j];

src/traces/scattergl/convert.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,10 @@ function convertMarkerStyle(trace) {
192192
// See https://github.com/plotly/plotly.js/pull/1781#discussion_r121820798
193193
if(multiLineWidth) {
194194
for(i = 0; i < count; i++) {
195-
borderSizes[i] = markerSizeFunc(optsIn.line.width[i]);
195+
borderSizes[i] = optsIn.line.width[i] / 2;
196196
}
197197
} else {
198-
s = markerSizeFunc(optsIn.line.width);
198+
s = optsIn.line.width / 2;
199199
for(i = 0; i < count; i++) {
200200
borderSizes[i] = s;
201201
}
@@ -219,7 +219,7 @@ function convertMarkerSelection(trace, target) {
219219
if(target.marker && target.marker.symbol) {
220220
optsOut = convertMarkerStyle(Lib.extendFlat({}, optsIn, target.marker));
221221
} else if(target.marker) {
222-
if(target.marker.size) optsOut.sizes = target.marker.size;
222+
if(target.marker.size) optsOut.sizes = target.marker.size / 2;
223223
if(target.marker.color) optsOut.colors = target.marker.color;
224224
if(target.marker.opacity !== undefined) optsOut.opacity = target.marker.opacity;
225225
}

src/traces/scattergl/index.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -492,12 +492,11 @@ function plot(gd, subplot, cdata) {
492492

493493
// regenerate scene batch, if traces number changed during selection
494494
if(trace.selectedpoints) {
495-
scene.selectBatch[id] = trace.selectedpoints;
495+
var selPts = scene.selectBatch[id] = Lib.selIndices2selPoints(trace);
496496

497-
var selPts = trace.selectedpoints;
498497
var selDict = {};
499498
for(i = 0; i < selPts.length; i++) {
500-
selDict[selPts[i]] = true;
499+
selDict[selPts[i]] = 1;
501500
}
502501
var unselPts = [];
503502
for(i = 0; i < stash.count; i++) {
21.3 KB
Loading
27.5 KB
Loading
+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
{
2+
"data": [{
3+
"type": "scattergl",
4+
"mode": "lines+markers+text",
5+
"x": [1, 2, 3, 4, 5, 6],
6+
"y": [1, 3, 2, 4, 5, 7],
7+
"ids": ["a", "b", "c", "d", "e", "f"],
8+
"text": ["a", "b", "c", "d", "e", "f"],
9+
"marker": {
10+
"color": "#67353E",
11+
"size": 12
12+
},
13+
"textposition": "top left",
14+
"selectedpoints": [1, 2, 3],
15+
"selected": {
16+
"marker": {
17+
"color": "blue",
18+
"size": 20
19+
}
20+
},
21+
"unselected": {
22+
"marker": {
23+
"color": "green",
24+
"opacity": 0.5
25+
}
26+
},
27+
"transforms": [{
28+
"type": "filter",
29+
"target": "x",
30+
"operation": "][",
31+
"value": [3.5, 4.5]
32+
}]
33+
}, {
34+
"type": "scattergl",
35+
"mode": "lines+markers+text",
36+
"x": [1, 2, 3, 4, 5, 6],
37+
"y": [6, 5, 6, 5, 4, 3],
38+
"ids": ["a", "b", "c", "d", "e", "f"],
39+
"text": ["a", "b", "c", "d", "e", "f"],
40+
"marker": {
41+
"color": "#34ABA2",
42+
"size": 12
43+
},
44+
"textposition": "top left",
45+
"selectedpoints": [],
46+
"selected": {
47+
"marker": {
48+
"color": "green"
49+
}
50+
},
51+
"unselected": {
52+
"marker": {
53+
"color": "blue",
54+
"opacity": 0.5
55+
}
56+
},
57+
"transforms": [{
58+
"type": "filter",
59+
"target": "x",
60+
"operation": "][",
61+
"value": [3.5, 4.5]
62+
}]
63+
}],
64+
"layout": {
65+
"dragmode": "lasso",
66+
"legend": {
67+
"x": 0,
68+
"y": 1,
69+
"xanchor": "left",
70+
"yanchor": "bottom"
71+
},
72+
"width": 600
73+
}
74+
}

test/image/mocks/gl2d_transforms.json

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"data": [{
3+
"type": "scattergl",
4+
"mode": "lines+markers",
5+
"x": [1, -1, -2, 0, 1, 3, 3],
6+
"y": [2, 1, 0, 1, 3, 4, 3],
7+
"transforms": [{
8+
"type": "groupby",
9+
"groups": ["a", "a", "b", "a", "b", "b", "a"],
10+
"styles": [
11+
{"target": "a", "value": {"marker": {"color": "orange"}}},
12+
{"target": "b", "value": {"marker": {"color": "blue"}}}
13+
]
14+
}, {
15+
"type": "filter",
16+
"target": "x",
17+
"operation": ">=",
18+
"value": 0,
19+
"preservegaps": true
20+
}],
21+
"name": "Groupby+filter"
22+
},
23+
{
24+
"type": "scattergl",
25+
"x": [1, 2, 3, 4, -3],
26+
"y": [1.1, 2.2, 3.3, 4.4, 5.5],
27+
"marker": {
28+
"size": [0.3, 0.2, 0.1, 0.4, 0.5],
29+
"sizeref": 0.01,
30+
"color": [2, 4, 6, 10, 8],
31+
"opacity": [0.9, 0.6, 0.2, 0.8, 1.0],
32+
"line": {
33+
"color": [2.2, 3.3, 4.4, 5.5, 1.1]
34+
}
35+
},
36+
"transforms": [{
37+
"type": "aggregate",
38+
"groups": ["a", "b", "a", "a", "a"],
39+
"aggregations": [
40+
{"target": "x", "func": "sum"},
41+
{"target": "y", "func": "avg"},
42+
{"target": "marker.size", "func": "min"},
43+
{"target": "marker.color", "func": "max"},
44+
{"target": "marker.line.color", "func": "last"},
45+
{"target": "marker.line.width", "func": "count"}
46+
]
47+
}],
48+
"name": "Aggregate"
49+
},
50+
{
51+
"type": "scattergl",
52+
"x": [1, 2, 3, 4, 5, 6],
53+
"y": [1, 4, 2, 6, 5, 3],
54+
"transforms": [{
55+
"type": "sort",
56+
"target": [1, 6, 2, 5, 3, 4]
57+
}],
58+
"name": "Sort"
59+
},
60+
{
61+
"type": "scattergl",
62+
"x":[4, 5, 6, 4, 5, 6],
63+
"y": [1, 1, 1, 2, 2, 2],
64+
"marker": {"color": [1, 2, 3, -1, -2, -3], "size": 20},
65+
"mode": "lines+markers",
66+
"transforms": [
67+
{"type": "groupby", "groups": [1, 1, 1, 2, 2, 2]}
68+
]
69+
}],
70+
"layout": {
71+
"width": 600,
72+
"height": 400,
73+
"title": "Transforms on scattergl traces"
74+
}
75+
}

0 commit comments

Comments
 (0)