Skip to content

Commit b792b8d

Browse files
committed
add support for heatmap and contour traces on multicategoy axes
1 parent d5777e9 commit b792b8d

File tree

5 files changed

+128
-41
lines changed

5 files changed

+128
-41
lines changed

src/traces/heatmap/convert_column_xyz.js

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,44 +14,36 @@ var BADNUM = require('../../constants/numerical').BADNUM;
1414

1515
module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, arrayVarNames) {
1616
var colLen = trace._length;
17-
var col1 = trace[var1Name].slice(0, colLen);
18-
var col2 = trace[var2Name].slice(0, colLen);
17+
var col1 = ax1.makeCalcdata(trace, var1Name);
18+
var col2 = ax2.makeCalcdata(trace, var2Name);
1919
var textCol = trace.text;
2020
var hasColumnText = (textCol !== undefined && Lib.isArray1D(textCol));
21-
var col1Calendar = trace[var1Name + 'calendar'];
22-
var col2Calendar = trace[var2Name + 'calendar'];
21+
var i, j;
2322

24-
var i, j, arrayVar, newArray, arrayVarName;
25-
26-
// TODO use makeCalcdata to make this work for multicategory?
27-
for(i = 0; i < colLen; i++) {
28-
col1[i] = ax1.d2c(col1[i], 0, col1Calendar);
29-
col2[i] = ax2.d2c(col2[i], 0, col2Calendar);
30-
}
31-
32-
var col1dv = Lib.distinctVals(col1),
33-
col1vals = col1dv.vals,
34-
col2dv = Lib.distinctVals(col2),
35-
col2vals = col2dv.vals,
36-
newArrays = [];
23+
var col1dv = Lib.distinctVals(col1);
24+
var col1vals = col1dv.vals;
25+
var col2dv = Lib.distinctVals(col2);
26+
var col2vals = col2dv.vals;
27+
var newArrays = [];
28+
var text;
3729

3830
for(i = 0; i < arrayVarNames.length; i++) {
3931
newArrays[i] = Lib.init2dArray(col2vals.length, col1vals.length);
4032
}
4133

42-
var i1, i2, text;
43-
44-
if(hasColumnText) text = Lib.init2dArray(col2vals.length, col1vals.length);
34+
if(hasColumnText) {
35+
text = Lib.init2dArray(col2vals.length, col1vals.length);
36+
}
4537

4638
for(i = 0; i < colLen; i++) {
4739
if(col1[i] !== BADNUM && col2[i] !== BADNUM) {
48-
i1 = Lib.findBin(col1[i] + col1dv.minDiff / 2, col1vals);
49-
i2 = Lib.findBin(col2[i] + col2dv.minDiff / 2, col2vals);
40+
var i1 = Lib.findBin(col1[i] + col1dv.minDiff / 2, col1vals);
41+
var i2 = Lib.findBin(col2[i] + col2dv.minDiff / 2, col2vals);
5042

5143
for(j = 0; j < arrayVarNames.length; j++) {
52-
arrayVarName = arrayVarNames[j];
53-
arrayVar = trace[arrayVarName];
54-
newArray = newArrays[j];
44+
var arrayVarName = arrayVarNames[j];
45+
var arrayVar = trace[arrayVarName];
46+
var newArray = newArrays[j];
5547
newArray[i2][i1] = arrayVar[i];
5648
}
5749

src/traces/heatmap/xyz_defaults.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
* LICENSE file in the root directory of this source tree.
77
*/
88

9-
109
'use strict';
1110

1211
var isNumeric = require('fast-isnumeric');
@@ -26,10 +25,13 @@ module.exports = function handleXYZDefaults(traceIn, traceOut, coerce, layout, x
2625
x = coerce(xName);
2726
y = coerce(yName);
2827

28+
var xlen = Lib.minRowLength(x);
29+
var ylen = Lib.minRowLength(y);
30+
2931
// column z must be accompanied by xName and yName arrays
30-
if(!(x && x.length && y && y.length)) return 0;
32+
if(xlen === 0 || ylen === 0) return 0;
3133

32-
traceOut._length = Math.min(x.length, y.length, z.length);
34+
traceOut._length = Math.min(xlen, ylen, z.length);
3335
}
3436
else {
3537
x = coordDefaults(xName, coerce);
@@ -50,10 +52,8 @@ module.exports = function handleXYZDefaults(traceIn, traceOut, coerce, layout, x
5052
};
5153

5254
function coordDefaults(coordStr, coerce) {
53-
var coord = coerce(coordStr),
54-
coordType = coord ?
55-
coerce(coordStr + 'type', 'array') :
56-
'scaled';
55+
var coord = coerce(coordStr);
56+
var coordType = coord ? coerce(coordStr + 'type', 'array') : 'scaled';
5757

5858
if(coordType === 'scaled') {
5959
coerce(coordStr + '0');
72.2 KB
Loading
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
{
2+
"data": [{
3+
"type": "heatmap",
4+
"name": "w/ 2d z",
5+
"x": [
6+
["2017", "2017", "2017", "2017", "2018", "2018", "2018"],
7+
["q1", "q2", "q3", "q4", "q1", "q2", "q3"]
8+
],
9+
"y": [
10+
["Group 1", "Group 1", "Group 1", "Group 2", "Group 2", "Group 2", "Group 3", "Group 3", "Group 3"],
11+
["A", "B", "C", "A", "B", "C", "A", "B", "C"]
12+
],
13+
"z": [
14+
[ 0.304, 1.465, 2.474, 3.05, 4.38, 5.245, 6.12 ],
15+
[ 0.3515, 1.326, 2.18, 3.26, 4.41, 5.25, 6.11 ],
16+
[ 0.3994, 1.167, 2.09, 3.306, 4.305, 5.35, 6.00 ],
17+
[ 0.297, 1.295, 2.49, 3.428, 4.13, 5.41, 6.38 ],
18+
[ 0.4602, 1.2256, 2.3356, 3.0667, 4.498, 5.411, 6.29 ],
19+
[ 0.0197, 1.274, 2.407, 3.22, 4.47, 5.44, 6.28 ],
20+
[ 0.32, 1.44, 2.303, 3.115, 4.49, 5.25, 6.46 ],
21+
[ 0.4446, 1.223, 2.367, 3.253, 4.385, 5.08, 6.19 ],
22+
[ 0.1304, 1.046, 2.45, 3.226, 4.34, 5.40, 6.05 ]
23+
],
24+
"colorbar": {
25+
"x": -0.15,
26+
"len": 0.3,
27+
"y": 1,
28+
"yanchor": "top"
29+
}
30+
}, {
31+
"type": "contour",
32+
"name": "w/ 2d z",
33+
"x": [
34+
["2017", "2017", "2017", "2017", "2018", "2018", "2018"],
35+
["q1", "q2", "q3", "q4", "q1", "q2", "q3"]
36+
],
37+
"y": [
38+
["Group 1", "Group 1", "Group 1", "Group 2", "Group 2", "Group 2", "Group 3", "Group 3", "Group 3"],
39+
["A", "B", "C", "A", "B", "C", "A", "B", "C"]
40+
],
41+
"z": [
42+
[ 0.1304, 1.046, 2.45, 3.226, 4.34, 5.40, 6.05 ],
43+
[ 0.3515, 1.326, 2.18, 3.26, 4.41, 5.25, 6.11 ],
44+
[ 0.3994, 1.167, 2.09, 3.306, 4.305, 5.35, 6.00 ],
45+
[ 0.32, 1.44, 2.303, 3.115, 4.49, 5.25, 6.46 ],
46+
[ 0.297, 1.295, 2.49, 3.428, 4.13, 5.41, 6.38 ],
47+
[ 0.0197, 1.274, 2.407, 3.22, 4.47, 5.44, 6.28 ],
48+
[ 0.4446, 1.223, 2.367, 3.253, 4.385, 5.08, 6.19 ],
49+
[ 0.4602, 1.2256, 2.3356, 3.0667, 4.498, 5.411, 6.29 ],
50+
[ 0.304, 1.465, 2.474, 3.05, 4.38, 5.245, 6.12 ]
51+
],
52+
"contours": {
53+
"coloring": "lines",
54+
"showlabels": true
55+
},
56+
"reversescale": true,
57+
"line": {
58+
"width": 4
59+
},
60+
"colorbar": {
61+
"x": -0.15,
62+
"len": 0.3,
63+
"y": 0.5
64+
}
65+
}, {
66+
"type": "heatmap",
67+
"name": "w/ 1d z",
68+
"x": [
69+
["2017", "2017", "2017", "2017", "2018", "2018", "2018"],
70+
["q1", "q2", "q3", "q4", "q1", "q2", "q3"]
71+
],
72+
"y": [
73+
["Group 1", "Group 1", "Group 1", "Group 2", "Group 2", "Group 2", "Group 3", "Group 3", "Group 3"],
74+
["A", "B", "C", "A", "B", "C", "A", "B", "C"]
75+
],
76+
"z": [1, 2, 3, 6, 5, 4, 11, 12, 13],
77+
"opacity": 0.4,
78+
"colorscale": "Greens",
79+
"colorbar": {
80+
"x": -0.15,
81+
"len": 0.3,
82+
"y": 0,
83+
"yanchor": "bottom"
84+
}
85+
}],
86+
"layout": {
87+
"title": {
88+
"text": "Multi-category heatmap/contour",
89+
"x": 0,
90+
"xref": "paper"
91+
},
92+
"xaxis": {
93+
"tickson": "boundaries"
94+
},
95+
"yaxis": {
96+
"tickson": "boundaries",
97+
"side": "right"
98+
}
99+
}
100+
}

test/jasmine/tests/heatmap_test.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,10 @@ describe('heatmap convertColumnXYZ', function() {
164164
'use strict';
165165

166166
var trace;
167-
168-
function makeMockAxis() {
169-
return {
170-
d2c: function(v) { return v; }
171-
};
172-
}
173-
174-
var xa = makeMockAxis();
175-
var ya = makeMockAxis();
167+
var xa = {type: 'linear'};
168+
var ya = {type: 'linear'};
169+
setConvert(xa);
170+
setConvert(ya);
176171

177172
function checkConverted(trace, x, y, z) {
178173
trace._length = Math.min(trace.x.length, trace.y.length, trace.z.length);

0 commit comments

Comments
 (0)