Text Sankey charts for flows between categories
Use glyphChartSankey(data, { source, target, value, name?, color? }) for directed, positive-valued flows. The example is an illustrative energy balance; values use the same unit throughout.
█──╮ ╭──█──╮ ╭──█ █──┴─╮ ╭─┴──█──┴─╮ ├──█ Solar 30 █────┼━━━━━ 30 ━━━━━┼────█────┼━━━━ 40 ━━━━┓ ╭─┴──█ █──┬─╯ ╰─┬──█──┬─╯ ┗━┼────█ Homes 40 █──╯ ╰──█──┤ ╰─┬──█ █──╯ ├──█ ╭────█ ╰──█ █──╮ ┏━┼────█──╮ █──┴─╮ ┃ ╰─┬──█──┼───── 20 ─────╮ Wind 25 █────┼━━━━ 25 ━━━━┛ ╰──█──╯ │ ╭────█ █──┬─╯ █ ╰─┼────█ Shops 20 █──╯ ╭──█──┬───── 15 ──────╮╰─┬──█ ├──█──╯ │ ╰──█ ╭─┴──█ │ █──╮ ┏━┼────█────╮ │ █──┴─╮ ┃ ╰─┬──█────┼━━━━ 25 ━━━━┓│ ╭──█ █────┤ ┃ ├──█──┬─╯ ┃╰──┼──█ Rail 15 Gas 45 █────┼━━━━ 45 ━━━━┛ ╰──█──╯ ┃ ╰──█ █────┤ Grid 100 ┃ █──┬─╯ ┃ █──┤ ┃ ╭────█ █──╯ ┗━┼────█ Industry 25 ╰─┬──█ ╰──█
Code
import { renderGlyphChart } from "@glyphcss/charts";
const { text } = renderGlyphChart({
type: "sankey",
data: [
{
from: "Solar",
to: "Grid",
amount: 30
},
{
from: "Wind",
to: "Grid",
amount: 25
},
{
from: "Gas",
to: "Grid",
amount: 45
},
{
from: "Grid",
to: "Homes",
amount: 40
},
{
from: "Grid",
to: "Shops",
amount: 20
},
{
from: "Grid",
to: "Rail",
amount: 15
},
{
from: "Grid",
to: "Industry",
amount: 25
}
],
channels: {
source: "from",
target: "to",
value: "amount"
}
}, {
target: "chat",
width: 72,
height: 24
});
console.log(text); import { glyphChartSankey, renderGlyphChart } from "@glyphcss/charts";const mark = glyphChartSankey( [ { from: "Solar", to: "Grid", amount: 30 }, { from: "Wind", to: "Grid", amount: 25 }, { from: "Gas", to: "Grid", amount: 45 }, { from: "Grid", to: "Homes", amount: 40 }, { from: "Grid", to: "Shops", amount: 20 }, { from: "Grid", to: "Rail", amount: 15 }, { from: "Grid", to: "Industry", amount: 25 }, ], { source: "from", target: "to", value: "amount" },);const result = renderGlyphChart(mark, { target: "chat", width: 72, height: 24 });- Values must be finite and greater than zero. Native cyclic input rejects with
sankey-cycle. sankey-imbalancereports differing inflow/outflow totals at intermediate nodes.- Increase width for more columns and height for more nodes/flows. Narrow layouts may fold thin flows into an identified “other” band or omit nodes; read every relevant render note.
- Sankey uses its graph structure, not Cartesian scales or transforms.
- This text renderer draws node stubs, brackets, and one line per flow rather than filled ribbons.
Mermaid Sankey accepts CSV source and can adapt cycles to a flow list. For dependencies without quantitative flow, use a flowchart.