Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 7ae6fd6

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

File tree

Expand file treeCollapse file tree

4 files changed

+263
-76
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+263
-76
lines changed

‎src/traces/sankey/attributes.js

Copy file name to clipboardExpand all lines: src/traces/sankey/attributes.js
+28-8Lines changed: 28 additions & 8 deletions
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;

‎src/traces/sankey/defaults.js

Copy file name to clipboardExpand all lines: src/traces/sankey/defaults.js
+35-17Lines changed: 35 additions & 17 deletions
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);

‎src/traces/sankey/plot.js

Copy file name to clipboardExpand all lines: src/traces/sankey/plot.js
+40-28Lines changed: 40 additions & 28 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.