Skip to content

Commit 7ae6fd6

Browse files
authored
Merge pull request #3096 from plotly/2782-hoverinfo-none-skip
implement hoverinfo 'none' and 'skip' in sankey
2 parents 117fbaa + ea73c64 commit 7ae6fd6

File tree

4 files changed

+263
-76
lines changed

4 files changed

+263
-76
lines changed

Diff for: src/traces/sankey/attributes.js

+28-8
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,13 @@
99
'use strict';
1010

1111
var fontAttrs = require('../../plots/font_attributes');
12-
var plotAttrs = require('../../plots/attributes');
1312
var colorAttrs = require('../../components/color/attributes');
1413
var fxAttrs = require('../../components/fx/attributes');
1514
var domainAttrs = require('../../plots/domain').attributes;
1615

17-
var extendFlat = require('../../lib/extend').extendFlat;
1816
var overrideAll = require('../../plot_api/edit_types').overrideAll;
1917

20-
module.exports = overrideAll({
21-
hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {
22-
flags: ['label', 'text', 'value', 'percent', 'name'],
23-
}),
24-
hoverlabel: fxAttrs.hoverlabel, // needs editType override
25-
18+
var attrs = module.exports = overrideAll({
2619
domain: domainAttrs({name: 'sankey', trace: true}),
2720

2821
orientation: {
@@ -127,6 +120,18 @@ module.exports = overrideAll({
127120
role: 'style',
128121
description: 'Sets the thickness (in px) of the `nodes`.'
129122
},
123+
hoverinfo: {
124+
valType: 'enumerated',
125+
values: ['all', 'none', 'skip'],
126+
dflt: 'all',
127+
role: 'info',
128+
description: [
129+
'Determines which trace information appear when hovering nodes.',
130+
'If `none` or `skip` are set, no information is displayed upon hovering.',
131+
'But, if `none` is set, click and hover events are still fired.'
132+
].join(' ')
133+
},
134+
hoverlabel: fxAttrs.hoverlabel, // needs editType override,
130135
description: 'The nodes of the Sankey plot.'
131136
},
132137

@@ -185,6 +190,21 @@ module.exports = overrideAll({
185190
role: 'info',
186191
description: 'A numeric value representing the flow volume value.'
187192
},
193+
hoverinfo: {
194+
valType: 'enumerated',
195+
values: ['all', 'none', 'skip'],
196+
dflt: 'all',
197+
role: 'info',
198+
description: [
199+
'Determines which trace information appear when hovering links.',
200+
'If `none` or `skip` are set, no information is displayed upon hovering.',
201+
'But, if `none` is set, click and hover events are still fired.'
202+
].join(' ')
203+
},
204+
hoverlabel: fxAttrs.hoverlabel, // needs editType override,
188205
description: 'The links of the Sankey plot.'
189206
}
190207
}, 'calc', 'nested');
208+
// hide unsupported top-level properties from plot-schema
209+
attrs.hoverinfo = undefined;
210+
attrs.hoverlabel = undefined;

Diff for: src/traces/sankey/defaults.js

+35-17
Original file line numberDiff line numberDiff line change
@@ -13,37 +13,55 @@ var attributes = require('./attributes');
1313
var Color = require('../../components/color');
1414
var tinycolor = require('tinycolor2');
1515
var handleDomainDefaults = require('../../plots/domain').defaults;
16+
var handleHoverLabelDefaults = require('../../components/fx/hoverlabel_defaults');
17+
var Template = require('../../plot_api/plot_template');
1618

1719
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
1820
function coerce(attr, dflt) {
1921
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
2022
}
2123

22-
coerce('node.label');
23-
coerce('node.pad');
24-
coerce('node.thickness');
25-
coerce('node.line.color');
26-
coerce('node.line.width');
24+
// node attributes
25+
var nodeIn = traceIn.node, nodeOut = Template.newContainer(traceOut, 'node');
26+
function coerceNode(attr, dflt) {
27+
return Lib.coerce(nodeIn, nodeOut, attributes.node, attr, dflt);
28+
}
29+
coerceNode('label');
30+
coerceNode('pad');
31+
coerceNode('thickness');
32+
coerceNode('line.color');
33+
coerceNode('line.width');
34+
coerceNode('hoverinfo');
35+
handleHoverLabelDefaults(nodeIn, nodeOut, coerceNode, layout.hoverlabel);
2736

2837
var colors = layout.colorway;
2938

3039
var defaultNodePalette = function(i) {return colors[i % colors.length];};
3140

32-
coerce('node.color', traceOut.node.label.map(function(d, i) {
41+
coerceNode('color', nodeOut.label.map(function(d, i) {
3342
return Color.addOpacity(defaultNodePalette(i), 0.8);
3443
}));
3544

36-
coerce('link.label');
37-
coerce('link.source');
38-
coerce('link.target');
39-
coerce('link.value');
40-
coerce('link.line.color');
41-
coerce('link.line.width');
42-
43-
coerce('link.color', traceOut.link.value.map(function() {
44-
return tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ?
45-
'rgba(255, 255, 255, 0.6)' :
46-
'rgba(0, 0, 0, 0.2)';
45+
// link attributes
46+
var linkIn = traceIn.link, linkOut = Template.newContainer(traceOut, 'link');
47+
function coerceLink(attr, dflt) {
48+
return Lib.coerce(linkIn, linkOut, attributes.link, attr, dflt);
49+
}
50+
coerceLink('label');
51+
coerceLink('source');
52+
coerceLink('target');
53+
coerceLink('value');
54+
coerceLink('line.color');
55+
coerceLink('line.width');
56+
coerceLink('hoverinfo');
57+
handleHoverLabelDefaults(linkIn, linkOut, coerceLink, layout.hoverlabel);
58+
59+
var defaultLinkColor = tinycolor(layout.paper_bgcolor).getLuminance() < 0.333 ?
60+
'rgba(255, 255, 255, 0.6)' :
61+
'rgba(0, 0, 0, 0.2)';
62+
63+
coerceLink('color', linkOut.value.map(function() {
64+
return defaultLinkColor;
4765
}));
4866

4967
handleDomainDefaults(traceOut, layout, coerce);

Diff for: src/traces/sankey/plot.js

+40-28
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,13 @@ module.exports = function plot(gd, calcData) {
132132
var linkHover = function(element, d, sankey) {
133133
if(gd._fullLayout.hovermode === false) return;
134134
d3.select(element).call(linkHoveredStyle.bind(0, d, sankey, true));
135-
gd.emit('plotly_hover', {
136-
event: d3.event,
137-
points: [d.link]
138-
});
135+
if(d.link.trace.link.hoverinfo !== 'skip') {
136+
gd.emit('plotly_hover', {
137+
event: d3.event,
138+
points: [d.link]
139+
});
140+
}
141+
139142
};
140143

141144
var sourceLabel = _(gd, 'source:') + ' ';
@@ -145,7 +148,8 @@ module.exports = function plot(gd, calcData) {
145148

146149
var linkHoverFollow = function(element, d) {
147150
if(gd._fullLayout.hovermode === false) return;
148-
var trace = d.link.trace;
151+
var obj = d.link.trace.link;
152+
if(obj.hoverinfo === 'none' || obj.hoverinfo === 'skip') return;
149153
var rootBBox = gd._fullLayout._paperdiv.node().getBoundingClientRect();
150154
var boundingBox = element.getBoundingClientRect();
151155
var hoverCenterX = boundingBox.left + boundingBox.width / 2;
@@ -160,11 +164,11 @@ module.exports = function plot(gd, calcData) {
160164
sourceLabel + d.link.source.label,
161165
targetLabel + d.link.target.label
162166
].filter(renderableValuePresent).join('<br>'),
163-
color: castHoverOption(trace, 'bgcolor') || Color.addOpacity(d.tinyColorHue, 1),
164-
borderColor: castHoverOption(trace, 'bordercolor'),
165-
fontFamily: castHoverOption(trace, 'font.family'),
166-
fontSize: castHoverOption(trace, 'font.size'),
167-
fontColor: castHoverOption(trace, 'font.color'),
167+
color: castHoverOption(obj, 'bgcolor') || Color.addOpacity(d.tinyColorHue, 1),
168+
borderColor: castHoverOption(obj, 'bordercolor'),
169+
fontFamily: castHoverOption(obj, 'font.family'),
170+
fontSize: castHoverOption(obj, 'font.size'),
171+
fontColor: castHoverOption(obj, 'font.color'),
168172
idealAlign: d3.event.x < hoverCenterX ? 'right' : 'left'
169173
}, {
170174
container: fullLayout._hoverlayer.node(),
@@ -179,10 +183,12 @@ module.exports = function plot(gd, calcData) {
179183
var linkUnhover = function(element, d, sankey) {
180184
if(gd._fullLayout.hovermode === false) return;
181185
d3.select(element).call(linkNonHoveredStyle.bind(0, d, sankey, true));
182-
gd.emit('plotly_unhover', {
183-
event: d3.event,
184-
points: [d.link]
185-
});
186+
if(d.link.trace.link.hoverinfo !== 'skip') {
187+
gd.emit('plotly_unhover', {
188+
event: d3.event,
189+
points: [d.link]
190+
});
191+
}
186192

187193
Fx.loneUnhover(fullLayout._hoverlayer.node());
188194
};
@@ -198,15 +204,19 @@ module.exports = function plot(gd, calcData) {
198204
var nodeHover = function(element, d, sankey) {
199205
if(gd._fullLayout.hovermode === false) return;
200206
d3.select(element).call(nodeHoveredStyle, d, sankey);
201-
gd.emit('plotly_hover', {
202-
event: d3.event,
203-
points: [d.node]
204-
});
207+
if(d.node.trace.node.hoverinfo !== 'skip') {
208+
gd.emit('plotly_hover', {
209+
event: d3.event,
210+
points: [d.node]
211+
});
212+
}
205213
};
206214

207215
var nodeHoverFollow = function(element, d) {
208216
if(gd._fullLayout.hovermode === false) return;
209-
var trace = d.node.trace;
217+
218+
var obj = d.node.trace.node;
219+
if(obj.hoverinfo === 'none' || obj.hoverinfo === 'skip') return;
210220
var nodeRect = d3.select(element).select('.' + cn.nodeRect);
211221
var rootBBox = gd._fullLayout._paperdiv.node().getBoundingClientRect();
212222
var boundingBox = nodeRect.node().getBoundingClientRect();
@@ -224,11 +234,11 @@ module.exports = function plot(gd, calcData) {
224234
incomingLabel + d.node.targetLinks.length,
225235
outgoingLabel + d.node.sourceLinks.length
226236
].filter(renderableValuePresent).join('<br>'),
227-
color: castHoverOption(trace, 'bgcolor') || d.tinyColorHue,
228-
borderColor: castHoverOption(trace, 'bordercolor'),
229-
fontFamily: castHoverOption(trace, 'font.family'),
230-
fontSize: castHoverOption(trace, 'font.size'),
231-
fontColor: castHoverOption(trace, 'font.color'),
237+
color: castHoverOption(obj, 'bgcolor') || d.tinyColorHue,
238+
borderColor: castHoverOption(obj, 'bordercolor'),
239+
fontFamily: castHoverOption(obj, 'font.family'),
240+
fontSize: castHoverOption(obj, 'font.size'),
241+
fontColor: castHoverOption(obj, 'font.color'),
232242
idealAlign: 'left'
233243
}, {
234244
container: fullLayout._hoverlayer.node(),
@@ -243,10 +253,12 @@ module.exports = function plot(gd, calcData) {
243253
var nodeUnhover = function(element, d, sankey) {
244254
if(gd._fullLayout.hovermode === false) return;
245255
d3.select(element).call(nodeNonHoveredStyle, d, sankey);
246-
gd.emit('plotly_unhover', {
247-
event: d3.event,
248-
points: [d.node]
249-
});
256+
if(d.node.trace.node.hoverinfo !== 'skip') {
257+
gd.emit('plotly_unhover', {
258+
event: d3.event,
259+
points: [d.node]
260+
});
261+
}
250262

251263
Fx.loneUnhover(fullLayout._hoverlayer.node());
252264
};

0 commit comments

Comments
 (0)