Skip to content

Commit 0826ee7

Browse files
committed
first cut scatterpolar calc/defaults/plot/style/hover
... and reuse Scatter.selectPoints straight up 🎉
1 parent 46fe066 commit 0826ee7

File tree

7 files changed

+315
-0
lines changed

7 files changed

+315
-0
lines changed

src/traces/scatterpolar/calc.js

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/**
2+
* Copyright 2012-2017, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
10+
'use strict';
11+
12+
var isNumeric = require('fast-isnumeric');
13+
var BADNUM = require('../../constants/numerical').BADNUM;
14+
15+
var Axes = require('../../plots/cartesian/axes');
16+
17+
var subTypes = require('../scatter/subtypes');
18+
var calcColorscale = require('../scatter/colorscale_calc');
19+
var arraysToCalcdata = require('../scatter/arrays_to_calcdata');
20+
var calcSelection = require('../scatter/calc_selection');
21+
22+
module.exports = function calc(gd, trace) {
23+
var fullLayout = gd._fullLayout;
24+
var subplotId = trace.subplot;
25+
var radialAxis = fullLayout[subplotId].radialaxis;
26+
var angularAxis = fullLayout[subplotId].angularaxis;
27+
var rArray = radialAxis.makeCalcdata(trace, 'r');
28+
var thetaArray = angularAxis.makeCalcdata(trace, 'theta');
29+
var len = rArray.length;
30+
var cd = new Array(len);
31+
32+
function c2rad(v) {
33+
return angularAxis.c2rad(v, trace.thetaunit);
34+
}
35+
36+
for(var i = 0; i < len; i++) {
37+
var r = rArray[i];
38+
var theta = thetaArray[i];
39+
var cdi = cd[i] = {};
40+
41+
if(isNumeric(r) && isNumeric(theta)) {
42+
var rad = cdi.rad = c2rad(theta);
43+
44+
cdi.r = r;
45+
cdi.theta = theta;
46+
cdi.x = r * Math.cos(rad);
47+
cdi.y = r * Math.sin(rad);
48+
} else {
49+
cdi.x = BADNUM;
50+
cdi.y = BADNUM;
51+
}
52+
}
53+
54+
Axes.expand(radialAxis, rArray, {tozero: true});
55+
56+
if(angularAxis.type !== 'linear') {
57+
angularAxis.autorange = true;
58+
Axes.expand(angularAxis, thetaArray);
59+
}
60+
61+
// TODO Dry up with other scatter* traces!
62+
//
63+
// TODO needs to bump auto ranges !!!
64+
var marker, s;
65+
if(subTypes.hasMarkers(trace)) {
66+
// Treat size like x or y arrays --- Run d2c
67+
// this needs to go before ppad computation
68+
marker = trace.marker;
69+
s = marker.size;
70+
71+
if(Array.isArray(s)) {
72+
var ax = {type: 'linear'};
73+
Axes.setConvert(ax);
74+
s = ax.makeCalcdata(trace.marker, 'size');
75+
if(s.length > len) s.splice(len, s.length - len);
76+
}
77+
}
78+
79+
calcColorscale(trace);
80+
arraysToCalcdata(cd, trace);
81+
calcSelection(cd, trace);
82+
83+
return cd;
84+
};

src/traces/scatterpolar/defaults.js

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* Copyright 2012-2017, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
'use strict';
10+
11+
var Lib = require('../../lib');
12+
13+
var subTypes = require('../scatter/subtypes');
14+
var handleMarkerDefaults = require('../scatter/marker_defaults');
15+
var handleLineDefaults = require('../scatter/line_defaults');
16+
var handleLineShapeDefaults = require('../scatter/line_shape_defaults');
17+
var handleTextDefaults = require('../scatter/text_defaults');
18+
var handleFillColorDefaults = require('../scatter/fillcolor_defaults');
19+
20+
var attributes = require('./attributes');
21+
22+
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
23+
function coerce(attr, dflt) {
24+
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
25+
}
26+
27+
var r = coerce('r');
28+
var theta = coerce('theta');
29+
var len = (r && theta) ? Math.min(r.length, theta.length) : 0;
30+
31+
if(!len) {
32+
traceOut.visible = false;
33+
return;
34+
}
35+
36+
if(len < r.length) traceOut.r = r.slice(0, len);
37+
if(len < theta.length) traceOut.theta = theta.slice(0, len);
38+
39+
coerce('thetaunit');
40+
coerce('mode');
41+
coerce('text');
42+
coerce('hovertext');
43+
44+
if(subTypes.hasLines(traceOut)) {
45+
handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce);
46+
handleLineShapeDefaults(traceIn, traceOut, coerce);
47+
coerce('connectgaps');
48+
}
49+
50+
if(subTypes.hasMarkers(traceOut)) {
51+
handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce, {gradient: true});
52+
}
53+
54+
if(subTypes.hasText(traceOut)) {
55+
handleTextDefaults(traceIn, traceOut, layout, coerce);
56+
}
57+
58+
var dfltHoverOn = [];
59+
60+
if(subTypes.hasMarkers(traceOut) || subTypes.hasText(traceOut)) {
61+
// TODO update other scatter*/defaults
62+
// cliponaxis has no effect on `mode: 'lines'` traces
63+
coerce('cliponaxis');
64+
65+
coerce('marker.maxdisplayed');
66+
dfltHoverOn.push('points');
67+
}
68+
69+
coerce('fill');
70+
71+
// TODO time for a subTypes.hasFill
72+
if(traceOut.fill !== 'none') {
73+
handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce);
74+
if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce);
75+
}
76+
77+
if(traceOut.fill === 'tonext' || traceOut.fill === 'toself') {
78+
dfltHoverOn.push('fills');
79+
}
80+
coerce('hoveron', dfltHoverOn.join('+') || 'points');
81+
82+
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
83+
};

src/traces/scatterpolar/hover.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Copyright 2012-2017, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
'use strict';
10+
11+
var scatterHover = require('../scatter/hover');
12+
13+
module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
14+
var scatterPointData = scatterHover(pointData, xval, yval, hovermode);
15+
if(!scatterPointData || scatterPointData[0].index === false) return;
16+
17+
var newPointData = scatterPointData[0];
18+
19+
return scatterPointData;
20+
};

src/traces/scatterpolar/index.js

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* Copyright 2012-2017, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
'use strict';
10+
11+
module.exports = {
12+
moduleType: 'trace',
13+
name: 'scatterpolar',
14+
basePlotModule: require('../../plots/polar'),
15+
categories: ['polar', 'symbols', 'markerColorscale', 'showLegend', 'scatter-like'],
16+
17+
attributes: require('./attributes'),
18+
supplyDefaults: require('./defaults'),
19+
calc: require('./calc'),
20+
plot: require('./plot'),
21+
style: require('./style'),
22+
hoverPoints: require('./hover'),
23+
selectPoints: require('../scatter/select'),
24+
25+
meta: {
26+
hrName: 'scatter_polar',
27+
description: [
28+
'The scatterpolar trace type encompasses line charts, scatter charts, text charts, and bubble charts.',
29+
'in polar coordinates.',
30+
'The data visualized as scatter point or lines is set in',
31+
'`r` (radial) and `theta` (angular). coordintes',
32+
'Text (appearing either on the chart or on hover only) is via `text`.',
33+
'Bubble charts are achieved by setting `marker.size` and/or `marker.color`',
34+
'to numerical arrays.'
35+
].join(' ')
36+
}
37+
};

src/traces/scatterpolar/plot.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Copyright 2012-2017, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
'use strict';
10+
11+
var scatterPlot = require('../scatter/plot');
12+
13+
module.exports = function plot(subplot, moduleCalcData) {
14+
var xa = subplot.xaxis;
15+
var ya = subplot.yaxis;
16+
var radius = subplot.radius;
17+
18+
var plotinfo = {
19+
xaxis: xa,
20+
yaxis: ya,
21+
plot: subplot.framework,
22+
layerClipId: subplot.hasClipOnAxisFalse ? subplot.clipIds.circle : null
23+
};
24+
25+
scatterPlot(subplot.graphDiv, plotinfo, moduleCalcData);
26+
};

src/traces/scatterpolar/style.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Copyright 2012-2017, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
10+
'use strict';
11+
12+
var scatterStyle = require('../scatter/style').style;
13+
14+
module.exports = function style(gd, cd) {
15+
// we're just going to call scatter style... if we already
16+
// called it, don't need to redo.
17+
// Later though we may want differences, or we may make style
18+
// more specific in its scope, then we can remove this.
19+
if(!cd) {
20+
var modules = gd._fullLayout._modules;
21+
for(var i = 0; i < modules.length; i++) {
22+
// TODO add category for scatterternary, scattercarpet
23+
// and scatterpolar which will all reuse this exact routine step
24+
if(modules[i].name === 'scatter') return;
25+
}
26+
}
27+
28+
scatterStyle(gd, cd);
29+
};
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// var Plotly = require('@lib');
2+
// var Lib = require('@src/lib');
3+
var ScatterPolar = require('@src/traces/scatterpolar');
4+
5+
describe('Test scatterpolar trace defaults:', function() {
6+
var traceOut;
7+
8+
function _supply(traceIn, layout) {
9+
traceOut = {};
10+
ScatterPolar.supplyDefaults(traceIn, traceOut, '#444', layout || {});
11+
}
12+
13+
it('should truncate *r* when longer than *theta*', function() {
14+
_supply({
15+
r: [1, 2, 3, 4, 5],
16+
theta: [1, 2, 3]
17+
});
18+
19+
expect(traceOut.r).toEqual([1, 2, 3]);
20+
expect(traceOut.theta).toEqual([1, 2, 3]);
21+
});
22+
23+
it('should truncate *theta* when longer than *r*', function() {
24+
_supply({
25+
r: [1, 2, 3],
26+
theta: [1, 2, 3, 4, 5]
27+
});
28+
29+
expect(traceOut.r).toEqual([1, 2, 3]);
30+
expect(traceOut.theta).toEqual([1, 2, 3]);
31+
});
32+
});
33+
34+
describe('Test scatterpolar calc:', function() {
35+
36+
});

0 commit comments

Comments
 (0)