Skip to content

Commit ebeddb5

Browse files
Merge pull request #3398 from plotly/more_hovertemplates
adding hovertemplates to polar bar and scatter and ternary scatter
2 parents 5aca948 + 8e45b14 commit ebeddb5

File tree

15 files changed

+92
-30
lines changed

15 files changed

+92
-30
lines changed

src/traces/barpolar/attributes.js

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
'use strict';
1010

11+
var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes');
1112
var extendFlat = require('../../lib/extend').extendFlat;
1213
var scatterPolarAttrs = require('../scatterpolar/attributes');
1314
var barAttrs = require('../bar/attributes');
@@ -69,6 +70,7 @@ module.exports = {
6970
marker: barAttrs.marker,
7071

7172
hoverinfo: scatterPolarAttrs.hoverinfo,
73+
hovertemplate: hovertemplateAttrs(),
7274

7375
selected: barAttrs.selected,
7476
unselected: barAttrs.unselected

src/traces/barpolar/defaults.js

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
3333
coerce('width');
3434

3535
coerce('text');
36+
coerce('hovertemplate');
3637
// coerce('hovertext');
3738

3839
// var textPosition = coerce('textposition');

src/traces/barpolar/hover.js

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ module.exports = function hoverPoints(pointData, xval, yval) {
6161
var _cdi = Lib.extendFlat({}, cdi, {r: cdi.s, theta: cdi.p});
6262
fillHoverText(cdi, trace, pointData);
6363
makeHoverPointText(_cdi, trace, subplot, pointData);
64+
pointData.hovertemplate = trace.hovertemplate;
6465
pointData.color = getTraceColor(trace, cdi);
6566
pointData.xLabelVal = pointData.yLabelVal = undefined;
6667

src/traces/scatterpolar/attributes.js

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
'use strict';
1010

11+
var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes');
1112
var extendFlat = require('../../lib/extend').extendFlat;
1213
var scatterAttrs = require('../scatter/attributes');
1314
var plotAttrs = require('../../plots/attributes');
@@ -130,6 +131,7 @@ module.exports = {
130131
flags: ['r', 'theta', 'text', 'name']
131132
}),
132133
hoveron: scatterAttrs.hoveron,
134+
hovertemplate: hovertemplateAttrs(),
133135

134136
selected: scatterAttrs.selected,
135137
unselected: scatterAttrs.unselected

src/traces/scatterpolar/defaults.js

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
3535
coerce('mode', len < PTS_LINESONLY ? 'lines+markers' : 'lines');
3636
coerce('text');
3737
coerce('hovertext');
38+
if(traceOut.hoveron !== 'fills') coerce('hovertemplate');
3839

3940
if(subTypes.hasLines(traceOut)) {
4041
handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce);

src/traces/scatterpolar/hover.js

+24-21
Original file line numberDiff line numberDiff line change
@@ -32,41 +32,44 @@ function hoverPoints(pointData, xval, yval, hovermode) {
3232
newPointData.xLabelVal = undefined;
3333
newPointData.yLabelVal = undefined;
3434
makeHoverPointText(cdi, trace, subplot, newPointData);
35-
35+
newPointData.hovertemplate = trace.hovertemplate;
3636
return scatterPointData;
3737
}
3838

3939
function makeHoverPointText(cdi, trace, subplot, pointData) {
40+
4041
var radialAxis = subplot.radialAxis;
4142
var angularAxis = subplot.angularAxis;
42-
var hoverinfo = cdi.hi || trace.hoverinfo;
43-
var parts = hoverinfo.split('+');
44-
var text = [];
45-
4643
radialAxis._hovertitle = 'r';
4744
angularAxis._hovertitle = 'θ';
4845

46+
var hoverinfo = cdi.hi || trace.hoverinfo;
47+
var text = [];
4948
function textPart(ax, val) {
5049
text.push(ax._hovertitle + ': ' + Axes.tickText(ax, val, 'hover').text);
5150
}
5251

53-
if(parts.indexOf('all') !== -1) parts = ['r', 'theta', 'text'];
54-
if(parts.indexOf('r') !== -1) {
55-
textPart(radialAxis, radialAxis.c2l(cdi.r));
56-
}
57-
if(parts.indexOf('theta') !== -1) {
58-
var theta = cdi.theta;
59-
textPart(
60-
angularAxis,
61-
angularAxis.thetaunit === 'degrees' ? Lib.rad2deg(theta) : theta
62-
);
63-
}
64-
if(parts.indexOf('text') !== -1 && pointData.text) {
65-
text.push(pointData.text);
66-
delete pointData.text;
67-
}
52+
if(!trace.hovertemplate) {
53+
var parts = hoverinfo.split('+');
54+
55+
if(parts.indexOf('all') !== -1) parts = ['r', 'theta', 'text'];
56+
if(parts.indexOf('r') !== -1) {
57+
textPart(radialAxis, radialAxis.c2l(cdi.r));
58+
}
59+
if(parts.indexOf('theta') !== -1) {
60+
var theta = cdi.theta;
61+
textPart(
62+
angularAxis,
63+
angularAxis.thetaunit === 'degrees' ? Lib.rad2deg(theta) : theta
64+
);
65+
}
66+
if(parts.indexOf('text') !== -1 && pointData.text) {
67+
text.push(pointData.text);
68+
delete pointData.text;
69+
}
6870

69-
pointData.extraText = text.join('<br>');
71+
pointData.extraText = text.join('<br>');
72+
}
7073
}
7174

7275
module.exports = {

src/traces/scatterpolargl/attributes.js

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ module.exports = {
2323

2424
text: scatterPolarAttrs.text,
2525
hovertext: scatterPolarAttrs.hovertext,
26+
hovertemplate: scatterPolarAttrs.hovertemplate,
2627

2728
line: scatterGlAttrs.line,
2829
connectgaps: scatterGlAttrs.connectgaps,

src/traces/scatterpolargl/defaults.js

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
3535
coerce('mode', len < PTS_LINESONLY ? 'lines+markers' : 'lines');
3636
coerce('text');
3737
coerce('hovertext');
38+
if(traceOut.hoveron !== 'fills') coerce('hovertemplate');
3839

3940
if(subTypes.hasLines(traceOut)) {
4041
handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce);

src/traces/scatterternary/attributes.js

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
'use strict';
1010

11+
var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes');
1112
var scatterAttrs = require('../scatter/attributes');
1213
var plotAttrs = require('../../plots/attributes');
1314
var colorAttributes = require('../../components/colorscale/attributes');
@@ -147,4 +148,5 @@ module.exports = {
147148
flags: ['a', 'b', 'c', 'text', 'name']
148149
}),
149150
hoveron: scatterAttrs.hoveron,
151+
hovertemplate: hovertemplateAttrs(),
150152
};

src/traces/scatterternary/defaults.js

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
6161

6262
coerce('text');
6363
coerce('hovertext');
64+
if(traceOut.hoveron !== 'fills') coerce('hovertemplate');
6465

6566
var defaultMode = len < constants.PTS_LINESONLY ? 'lines+markers' : 'lines';
6667
coerce('mode', defaultMode);

src/traces/scatterternary/hover.js

+8-9
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,18 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
5252
var trace = newPointData.trace;
5353
var ternary = newPointData.subplot;
5454
var hoverinfo = cdi.hi || trace.hoverinfo;
55-
var parts = hoverinfo.split('+');
5655
var text = [];
57-
5856
function textPart(ax, val) {
5957
text.push(ax._hovertitle + ': ' + Axes.tickText(ax, val, 'hover').text);
6058
}
61-
62-
if(parts.indexOf('all') !== -1) parts = ['a', 'b', 'c'];
63-
if(parts.indexOf('a') !== -1) textPart(ternary.aaxis, cdi.a);
64-
if(parts.indexOf('b') !== -1) textPart(ternary.baxis, cdi.b);
65-
if(parts.indexOf('c') !== -1) textPart(ternary.caxis, cdi.c);
66-
59+
if(!trace.hovertemplate) {
60+
var parts = hoverinfo.split('+');
61+
if(parts.indexOf('all') !== -1) parts = ['a', 'b', 'c'];
62+
if(parts.indexOf('a') !== -1) textPart(ternary.aaxis, cdi.a);
63+
if(parts.indexOf('b') !== -1) textPart(ternary.baxis, cdi.b);
64+
if(parts.indexOf('c') !== -1) textPart(ternary.caxis, cdi.c);
65+
}
6766
newPointData.extraText = text.join('<br>');
68-
67+
newPointData.hovertemplate = trace.hovertemplate;
6968
return scatterPointData;
7069
};

test/jasmine/tests/barpolar_test.js

+16
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,22 @@ describe('Test barpolar hover:', function() {
115115
extraText: 'r: 1<br>θ: 0°',
116116
color: '#1f77b4'
117117
}
118+
}, {
119+
desc: 'hovertemplate',
120+
traces: [{
121+
r: [1, 2, 3],
122+
theta: [0, 90, 180],
123+
hovertemplate: 'tpl',
124+
}],
125+
xval: 1,
126+
yval: 0,
127+
exp: {
128+
index: 0,
129+
x: 263.33,
130+
y: 200,
131+
hovertemplate: 'tpl',
132+
color: '#1f77b4'
133+
}
118134
}, {
119135
desc: 'with custom text scalar',
120136
traces: [{

test/jasmine/tests/scatterpolar_test.js

+8
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ describe('Test scatterpolar hover:', function() {
109109
desc: 'base',
110110
nums: 'r: 4.022892\nθ: 128.342°',
111111
name: 'Trial 3'
112+
}, {
113+
desc: 'with hovertemplate',
114+
patch: function(fig) {
115+
fig.data[2].hovertemplate = 'template %{r} %{theta}';
116+
return fig;
117+
},
118+
nums: 'template 4.02289202968 128.342009045',
119+
name: 'Trial 3'
112120
}, {
113121
desc: '(no labels - out of sector)',
114122
patch: function(fig) {

test/jasmine/tests/scatterpolargl_test.js

+8
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ describe('Test scatterpolargl hover:', function() {
4444
desc: 'base',
4545
nums: 'r: 3.886013\nθ: 125.2822°',
4646
name: 'Trial 3'
47+
}, {
48+
desc: 'with hovertemplate',
49+
patch: function(fig) {
50+
fig.data[2].hovertemplate = 'template %{r} %{theta}';
51+
return fig;
52+
},
53+
nums: 'template 3.88601339194 125.282157112',
54+
name: 'Trial 3'
4755
}, {
4856
desc: '(no labels - out of sector)',
4957
patch: function(fig) {

test/jasmine/tests/scatterternary_test.js

+16
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,22 @@ describe('scatterternary hover', function() {
402402
.then(done);
403403
});
404404

405+
it('should pass along hovertemplate on hover', function(done) {
406+
var xval = 0.42;
407+
var yval = 0.37;
408+
var hovermode = 'closest';
409+
var scatterPointData;
410+
Plotly.restyle(gd, {
411+
hovertemplate: 'tpl'
412+
})
413+
.then(function() {
414+
scatterPointData = _hover(gd, xval, yval, hovermode);
415+
expect(scatterPointData[0].hovertemplate).toEqual('tpl');
416+
})
417+
.catch(failTest)
418+
.then(done);
419+
});
420+
405421
});
406422

407423
describe('Test scatterternary *cliponaxis*', function() {

0 commit comments

Comments
 (0)