Skip to content

Add labels on sankey links - #7888

Open
wf-r wants to merge 11 commits into
plotly:v4.0from
wf-r:text_on_sankey_links
Open

Add labels on sankey links#7888
wf-r wants to merge 11 commits into
plotly:v4.0from
wf-r:text_on_sankey_links

Conversation

@wf-r

@wf-r wf-r commented Jul 3, 2026

Copy link
Copy Markdown

Add permanent text labels to Sankey links

What

Adds persistent, always-visible text labels to Sankey links, analogous to the existing node
labels. Five new attributes under link:

Attribute Type Description
link.textinfo flaglist: "label", "value", "none" Which information to show permanently on links
link.texttemplate string / arrayOk Template string, overrides textinfo when set
link.textfont font Font for link labels
link.valueformat string d3 format string for the value component
link.valuesuffix string Unit suffix appended to the formatted value

Why

Link information is currently hover-only, making Sankey diagrams unsuitable for static export
(PNG/SVG/print) wherever flow values or names need to be visible at all times. There is
long-standing community interest in this — see #4746.

External SVG overlays (the current workaround) are fragile: they break on node drags, require
timing hacks after layout transitions, and are excluded from toImage export. Native labels
solve all three problems.

How

Labels are rendered as real SVG <text> elements inside the .sankey group, immediately after
the link paths. This means:

  • The existing group-level orientation transform applies automatically — labels stay upright in
    h and v layouts with no extra handling.
  • Labels follow node drags via the existing updateShapes hook — no separate drag listener
    needed.
  • Labels are included in toImage/PNG/SVG export — no overlay required.
    For circular (backward) links the label anchor reuses the same circularPathData midpoint as
    the hover label, so the position is consistent. Vertical centering on the anchor uses
    dominant-baseline="central".

Template rendering follows the established funnel/pie pattern via Lib.texttemplateString.
Available template variables: %{label}, %{value}, %{valueLabel} (formatted value +
suffix), %{source}, %{target}, %{customdata}.

Backward compatibility

Fully backward compatible. All new attributes default to textinfo: 'none' / texttemplate: '',
so existing figures render identically. No existing tests or baselines are affected.

Related

@wf-r

wf-r commented Jul 25, 2026

Copy link
Copy Markdown
Author

If you are interested in this please let me know. #7870 was just merged into v4.0, and would need some rework here to incorporate correct positioning.

@camdecoster

camdecoster commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

@wf-r go for it. You'll need to change the target branch to v4.0.

@wf-r
wf-r marked this pull request as draft July 27, 2026 07:13
@wf-r

wf-r commented Jul 27, 2026

Copy link
Copy Markdown
Author

You'll need to change the target branch to v4.0.

I think I am not allowed to do it (or I don't find the option). Can you do this, please?

@wf-r
wf-r marked this pull request as ready for review July 27, 2026 08:09
@wf-r

wf-r commented Jul 27, 2026

Copy link
Copy Markdown
Author

Please have a look at this.

…ominant-baseline, use block-shift like node labels), thread _d3locale/_meta/fallback through texttemplateString, and dedupe the orientation counter-transform into a shared uprightTransform helper.Also make opted-out traces free of per-link work by short-circuiting linkTextGetter to null.
@wf-r

wf-r commented Jul 27, 2026

Copy link
Copy Markdown
Author

I'm done for today. Things one could discuss:

  • new attribute link.valueformat only applies to permanent link labels, not to link hovers (trace.valueformat does all the rest).
  • link.textfont again only applies to permanent link labels, trace.textfont to everything else
  • labels do currently not fade out. should they?

… group (fixes z-order with entering link paths), thread the label selection through updateShapes/attachDragHandler/startForce instead of DOM-querying every drag frame, and build each link's model once via a shared linkModels cache instead of duplicating it for paths and labels; exiting labels now fade out like links, and per-link texttemplate lookups use pointNumber instead of the loop index. Also switch link.texttemplate to the shared texttemplateAttrs() helper for a standard description and %{meta} support. More details in draftlog.
@camdecoster
camdecoster changed the base branch from master to v4.0 July 27, 2026 15:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants