Skip to content

Commit d3ff96b

Browse files
authored
Merge pull request #2499 from plotly/point-cluster-dev
Point cluster dev
2 parents c385218 + 0d74d2f commit d3ff96b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+119
-47
lines changed

package-lock.json

Lines changed: 48 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@
8686
"glslify": "^6.1.1",
8787
"has-hover": "^1.0.1",
8888
"has-passive-events": "^1.0.0",
89-
"kdgrass": "^1.0.1",
9089
"mapbox-gl": "0.44.1",
9190
"matrix-camera-controller": "^2.1.3",
9291
"mouse-change": "^1.4.0",
@@ -96,11 +95,12 @@
9695
"ndarray-fill": "^1.0.2",
9796
"ndarray-homography": "^1.0.0",
9897
"ndarray-ops": "^1.2.2",
98+
"point-cluster": "^3.1.2",
9999
"polybooljs": "^1.2.0",
100100
"regl": "^1.3.1",
101101
"regl-error2d": "^2.0.3",
102102
"regl-line2d": "^2.1.5",
103-
"regl-scatter2d": "^2.1.17",
103+
"regl-scatter2d": "^3.0.0",
104104
"right-now": "^1.0.0",
105105
"robust-orientation": "^1.1.3",
106106
"sane-topojson": "^2.0.0",

src/traces/scattergl/convert.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ var subTypes = require('../scatter/subtypes');
2121
var makeBubbleSizeFn = require('../scatter/make_bubble_size_func');
2222

2323
var constants = require('./constants');
24+
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
2425

2526
function convertStyle(gd, trace) {
2627
var i;
@@ -41,6 +42,14 @@ function convertStyle(gd, trace) {
4142
opts.marker = convertMarkerStyle(trace);
4243
opts.selected = convertMarkerSelection(trace, trace.selected);
4344
opts.unselected = convertMarkerSelection(trace, trace.unselected);
45+
46+
if(!trace.unselected && Array.isArray(trace.marker.opacity)) {
47+
var mo = trace.marker.opacity;
48+
opts.unselected.opacity = new Array(mo.length);
49+
for(i = 0; i < mo.length; i++) {
50+
opts.unselected.opacity[i] = DESELECTDIM * mo[i];
51+
}
52+
}
4453
}
4554

4655
if(subTypes.hasLines(trace)) {

src/traces/scattergl/index.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var createRegl = require('regl');
1212
var createScatter = require('regl-scatter2d');
1313
var createLine = require('regl-line2d');
1414
var createError = require('regl-error2d');
15-
var kdtree = require('kdgrass');
15+
var cluster = require('point-cluster');
1616
var arrayRange = require('array-range');
1717

1818
var Registry = require('../../registry');
@@ -72,7 +72,7 @@ function calc(gd, trace) {
7272
// and it is also
7373
if(xa.type !== 'log' && ya.type !== 'log') {
7474
// FIXME: delegate this to webworker
75-
stash.tree = kdtree(positions, 512);
75+
stash.tree = cluster(positions);
7676
} else {
7777
var ids = stash.ids = new Array(count);
7878
for(i = 0; i < count; i++) {
@@ -104,6 +104,12 @@ function calc(gd, trace) {
104104
if(opts.line && !scene.line2d) scene.line2d = true;
105105
if((opts.errorX || opts.errorY) && !scene.error2d) scene.error2d = true;
106106

107+
// FIXME: organize it in a more appropriate manner, probably in sceneOptions
108+
// put point-cluster instance for optimized regl calc
109+
if(opts.marker && count >= TOO_MANY_POINTS) {
110+
opts.marker.cluster = stash.tree;
111+
}
112+
107113
// save scene opts batch
108114
scene.lineOptions.push(opts.line);
109115
scene.errorXOptions.push(opts.errorX);
@@ -547,10 +553,7 @@ function plot(gd, subplot, cdata) {
547553
// create select2d
548554
if(!scene.select2d) {
549555
// create scatter instance by cloning scatter2d
550-
scene.select2d = createScatter(
551-
fullLayout._glcanvas.data()[1].regl,
552-
{clone: scene.scatter2d}
553-
);
556+
scene.select2d = createScatter(fullLayout._glcanvas.data()[1].regl);
554557
}
555558

556559
if(scene.scatter2d && scene.selectBatch && scene.selectBatch.length) {

src/traces/scatterpolargl/index.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
'use strict';
1010

11-
var kdtree = require('kdgrass');
11+
var cluster = require('point-cluster');
1212
var isNumeric = require('fast-isnumeric');
1313

1414
var ScatterGl = require('../scattergl');
@@ -17,6 +17,8 @@ var Axes = require('../../plots/cartesian/axes');
1717
var makeHoverPointText = require('../scatterpolar/hover').makeHoverPointText;
1818
var subTypes = require('../scatter/subtypes');
1919

20+
var TOO_MANY_POINTS = require('../scattergl/constants').TOO_MANY_POINTS;
21+
2022
function calc(container, trace) {
2123
var layout = container._fullLayout;
2224
var subplotId = trace.subplot;
@@ -106,6 +108,13 @@ function plot(container, subplot, cdata) {
106108
if(options.line && !scene.line2d) scene.line2d = true;
107109
if((options.errorX || options.errorY) && !scene.error2d) scene.error2d = true;
108110

111+
stash.tree = cluster(positions);
112+
113+
// FIXME: see scattergl.js#109
114+
if(options.marker && count >= TOO_MANY_POINTS) {
115+
options.marker.cluster = stash.tree;
116+
}
117+
109118
// bring positions to selected/unselected options
110119
if(subTypes.hasMarkers(trace)) {
111120
options.selected.positions = options.unselected.positions = options.marker.positions;
@@ -132,7 +141,6 @@ function plot(container, subplot, cdata) {
132141
stash.theta = thetaArray;
133142
stash.positions = positions;
134143
stash.count = count;
135-
stash.tree = kdtree(positions, 512);
136144
});
137145

138146
return ScatterGl.plot(container, subplot, cdata);

tasks/test_syntax.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ function assertES5() {
282282
});
283283

284284
var files = constants.partialBundlePaths.map(function(f) { return f.dist; });
285-
files.unshift(constants.pathToPlotlyDist);
285+
files.unshift(constants.pathToPlotlyBuild, constants.pathToPlotlyDist);
286286

287287
var report = cli.executeOnFiles(files);
288288
var formatter = cli.getFormatter();

test/image/baselines/gl2d_14.png

-469 Bytes

test/image/baselines/gl2d_17.png

-64 Bytes
-99 Bytes
32 Bytes

0 commit comments

Comments
 (0)