Skip to content

Commit 4f881fa

Browse files
committed
add r0/dr theta0/dtheta
- where the dtheta default is the ax.period divided by the trace length (given by the length of the 'other' coordinate).
1 parent 3787bfa commit 4f881fa

File tree

10 files changed

+207
-15
lines changed

10 files changed

+207
-15
lines changed

src/plots/polar/layout_defaults.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ function handleAxisTypeDefaults(axIn, axOut, coerce, subplotData, dataAttr) {
198198
}
199199
}
200200

201-
if(trace) {
201+
if(trace && trace[dataAttr]) {
202202
axOut.type = autoType(trace[dataAttr], 'gregorian');
203203
}
204204

src/plots/polar/set_convert.js

+11
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,18 @@ function setConvertAngular(ax, polarLayout) {
122122
for(i = 0; i < len; i++) {
123123
arrayOut[i] = _d2c(arrayIn[i]);
124124
}
125+
} else {
126+
var coord0 = coord + '0';
127+
var dcoord = 'd' + coord;
128+
var v0 = (coord0 in trace) ? _d2c(trace[coord0]) : 0;
129+
var dv = (trace[dcoord]) ? _d2c(trace[dcoord]) : (ax.period || 2 * Math.PI) / len;
130+
131+
arrayOut = new Array(len);
132+
for(i = 0; i < len; i++) {
133+
arrayOut[i] = v0 + i * dv;
134+
}
125135
}
136+
126137
return arrayOut;
127138
};
128139

src/traces/scatterpolar/attributes.js

+43
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,49 @@ module.exports = {
2828
description: 'Sets the angular coordinates'
2929
},
3030

31+
r0: {
32+
valType: 'any',
33+
dflt: 0,
34+
role: 'info',
35+
editType: 'calc+clearAxisTypes',
36+
description: [
37+
'Alternate to `r`.',
38+
'Builds a linear space of r coordinates.',
39+
'Use with `dr`',
40+
'where `r0` is the starting coordinate and `dr` the step.'
41+
].join(' ')
42+
},
43+
dr: {
44+
valType: 'number',
45+
dflt: 1,
46+
role: 'info',
47+
editType: 'calc',
48+
description: 'Sets the r coordinate step.'
49+
},
50+
51+
theta0: {
52+
valType: 'any',
53+
dflt: 0,
54+
role: 'info',
55+
editType: 'calc+clearAxisTypes',
56+
description: [
57+
'Alternate to `theta`.',
58+
'Builds a linear space of theta coordinates.',
59+
'Use with `dtheta`',
60+
'where `theta0` is the starting coordinate and `dtheta` the step.'
61+
].join(' ')
62+
},
63+
dtheta: {
64+
valType: 'number',
65+
role: 'info',
66+
editType: 'calc',
67+
description: [
68+
'Sets the theta coordinate step.',
69+
'By default, the `dtheta` step equals the subplot\'s period divided',
70+
'by the length of the `r` coordinates.'
71+
].join(' ')
72+
},
73+
3174
thetaunit: {
3275
valType: 'enumerated',
3376
values: ['radians', 'degrees', 'gradians'],

src/traces/scatterpolar/defaults.js

+31-7
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,17 @@ var PTS_LINESONLY = require('../scatter/constants').PTS_LINESONLY;
2020

2121
var attributes = require('./attributes');
2222

23-
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
23+
function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
2424
function coerce(attr, dflt) {
2525
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
2626
}
2727

28-
var r = coerce('r');
29-
var theta = coerce('theta');
30-
var len = (r && theta) ? Math.min(r.length, theta.length) : 0;
31-
28+
var len = handleRThetaDefaults(traceIn, traceOut, layout, coerce);
3229
if(!len) {
3330
traceOut.visible = false;
3431
return;
3532
}
3633

37-
traceOut._length = len;
38-
3934
coerce('thetaunit');
4035
coerce('mode', len < PTS_LINESONLY ? 'lines+markers' : 'lines');
4136
coerce('text');
@@ -76,4 +71,33 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
7671
coerce('hoveron', dfltHoverOn.join('+') || 'points');
7772

7873
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
74+
}
75+
76+
function handleRThetaDefaults(traceIn, traceOut, layout, coerce) {
77+
var r = coerce('r');
78+
var theta = coerce('theta');
79+
var len;
80+
81+
if(r) {
82+
if(theta) {
83+
len = Math.min(r.length, theta.length);
84+
} else {
85+
len = r.length;
86+
coerce('theta0');
87+
coerce('dtheta');
88+
}
89+
} else {
90+
if(!theta) return 0;
91+
len = traceOut.theta.length;
92+
coerce('r0');
93+
coerce('dr');
94+
}
95+
96+
traceOut._length = len;
97+
return len;
98+
}
99+
100+
module.exports = {
101+
handleRThetaDefaults: handleRThetaDefaults,
102+
supplyDefaults: supplyDefaults
79103
};

src/traces/scatterpolar/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ module.exports = {
1515
categories: ['polar', 'symbols', 'showLegend', 'scatter-like'],
1616

1717
attributes: require('./attributes'),
18-
supplyDefaults: require('./defaults'),
18+
supplyDefaults: require('./defaults').supplyDefaults,
1919
colorbar: require('../scatter/marker_colorbar'),
2020
calc: require('./calc'),
2121
plot: require('./plot'),

src/traces/scatterpolargl/attributes.js

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ module.exports = {
1515
mode: scatterPolarAttrs.mode,
1616
r: scatterPolarAttrs.r,
1717
theta: scatterPolarAttrs.theta,
18+
r0: scatterPolarAttrs.r0,
19+
dr: scatterPolarAttrs.dr,
20+
theta0: scatterPolarAttrs.theta0,
21+
dtheta: scatterPolarAttrs.dtheta,
1822
thetaunit: scatterPolarAttrs.thetaunit,
1923

2024
text: scatterPolarAttrs.text,

src/traces/scatterpolargl/defaults.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
var Lib = require('../../lib');
1212

1313
var subTypes = require('../scatter/subtypes');
14+
var handleRThetaDefaults = require('../scatterpolar/defaults').handleRThetaDefaults;
1415
var handleMarkerDefaults = require('../scatter/marker_defaults');
1516
var handleLineDefaults = require('../scatter/line_defaults');
1617
var handleFillColorDefaults = require('../scatter/fillcolor_defaults');
@@ -23,17 +24,12 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
2324
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
2425
}
2526

26-
var r = coerce('r');
27-
var theta = coerce('theta');
28-
var len = (r && theta) ? Math.min(r.length, theta.length) : 0;
29-
27+
var len = handleRThetaDefaults(traceIn, traceOut, layout, coerce);
3028
if(!len) {
3129
traceOut.visible = false;
3230
return;
3331
}
3432

35-
traceOut._length = len;
36-
3733
coerce('thetaunit');
3834
coerce('mode', len < PTS_LINESONLY ? 'lines+markers' : 'lines');
3935
coerce('text');
69.8 KB
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
{
2+
"data": [{
3+
"type": "scatterpolar",
4+
"name": "missing θ",
5+
"r": [1, 2, 3]
6+
}, {
7+
"type": "scatterpolar",
8+
"name": "missing r",
9+
"theta": [0, -90, -220]
10+
}, {
11+
"type": "scatterpolar",
12+
"name": "set r0/dr",
13+
"r0": 5,
14+
"dr": -1,
15+
"theta": [0, -90, -190]
16+
}, {
17+
"type": "scatterpolar",
18+
"name": "set θ<sub>0</sub>/dθ",
19+
"r": [1, 2, 3],
20+
"theta0": 1,
21+
"dtheta": 2,
22+
"thetaunit": "radians"
23+
},
24+
25+
{
26+
"type": "scatterpolargl",
27+
"name": "[gl] missing θ",
28+
"subplot": "polar2",
29+
"marker": {"color": "#1f77b4"},
30+
"r": [1, 2, 3]
31+
}, {
32+
"type": "scatterpolargl",
33+
"name": "[gl] missing r",
34+
"subplot": "polar2",
35+
"marker": {"color": "#ff7f0e"},
36+
"theta": [0, -90, -220]
37+
}, {
38+
"type": "scatterpolargl",
39+
"name": "[gl] set r0/dr",
40+
"subplot": "polar2",
41+
"marker": {"color": "#2ca02c"},
42+
"r0": 5,
43+
"dr": -1,
44+
"theta": [0, -90, -190]
45+
}, {
46+
"type": "scatterpolargl",
47+
"name": "[gl] set θ<sub>0</sub>/dθ",
48+
"subplot": "polar2",
49+
"marker": {"color": "#d62728"},
50+
"r": [1, 2, 3],
51+
"theta0": 1,
52+
"dtheta": 2,
53+
"thetaunit": "radians"
54+
}],
55+
"layout": {
56+
"width": 500,
57+
"height": 800,
58+
"margin": {"l": 200, "t": 20, "b": 20},
59+
"legend": {
60+
"x": -0.2,
61+
"xanchor": "right",
62+
"y": 0.5
63+
},
64+
"polar": {
65+
"domain": {
66+
"x": [0, 1],
67+
"y": [0.5, 1]
68+
}
69+
},
70+
"polar2": {
71+
"domain": {
72+
"x": [0, 1],
73+
"y": [0, 0.5]
74+
}
75+
}
76+
}
77+
}

test/jasmine/tests/scatterpolar_test.js

+37
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ describe('Test scatterpolar trace defaults:', function() {
2828
expect(traceOut.r).toEqual([1, 2, 3, 4, 5]);
2929
expect(traceOut.theta).toEqual([1, 2, 3]);
3030
expect(traceOut._length).toBe(3);
31+
expect(traceOut.r0).toBeUndefined();
32+
expect(traceOut.dr).toBeUndefined();
33+
expect(traceOut.theta0).toBeUndefined();
34+
expect(traceOut.dtheta).toBeUndefined();
3135
});
3236

3337
it('should not truncate *theta* when longer than *r*', function() {
@@ -40,6 +44,39 @@ describe('Test scatterpolar trace defaults:', function() {
4044
expect(traceOut.r).toEqual([1, 2, 3]);
4145
expect(traceOut.theta).toEqual([1, 2, 3, 4, 5]);
4246
expect(traceOut._length).toBe(3);
47+
expect(traceOut.r0).toBeUndefined();
48+
expect(traceOut.dr).toBeUndefined();
49+
expect(traceOut.theta0).toBeUndefined();
50+
expect(traceOut.dtheta).toBeUndefined();
51+
});
52+
53+
it('should coerce *theta0* and *dtheta* when *theta* is not set', function() {
54+
_supply({
55+
r: [1, 2, 3]
56+
});
57+
58+
expect(traceOut.r).toEqual([1, 2, 3]);
59+
expect(traceOut.theta).toBeUndefined();
60+
expect(traceOut._length).toBe(3);
61+
expect(traceOut.r0).toBeUndefined();
62+
expect(traceOut.dr).toBeUndefined();
63+
expect(traceOut.theta0).toBe(0);
64+
// its default value is computed later
65+
expect(traceOut.dtheta).toBeUndefined();
66+
});
67+
68+
it('should coerce *r0* and *dr* when *r* is not set', function() {
69+
_supply({
70+
theta: [1, 2, 3, 4, 5]
71+
});
72+
73+
expect(traceOut.r).toBeUndefined();
74+
expect(traceOut.theta).toEqual([1, 2, 3, 4, 5]);
75+
expect(traceOut._length).toBe(5);
76+
expect(traceOut.r0).toBe(0);
77+
expect(traceOut.dr).toBe(1);
78+
expect(traceOut.theta0).toBeUndefined();
79+
expect(traceOut.dtheta).toBeUndefined();
4380
});
4481
});
4582

0 commit comments

Comments
 (0)