Charts / CH-FLO-02
CH-FLO-02 . family FLO

SANKEY

column-stacked nodes joined by width-true bands. Needs: 2-3 node columns + links between adjacent columns; conserved totals.

flowcompositionvariance-decomposition

DL-01 AGRAW
Road carries 70 of 130 loads; barge stays marginal Supplier A 60 loads Supplier B 40 Supplier C 30 Road 70 Rail 40 Barge 20 Source: sample dataset v1, 2026-07-12

Use when

  • where things came from and where they went, conserved end to end
  • sources to routes to destinations in one figure

Do not use when

  • cyclic flows (sankeys are acyclic by construction)
  • more than ~6 nodes per column

See instead

Alternatives

  • CH-FLO-01 (one total changing through steps)
  • CH-PTW-01 (composition without flow)

Rules

  • band width IS the value, at both ends; totals conserve per node
  • nodes stacked deterministically in input order, centered per column
  • links drawn in input order: order is part of the spec

Never do this

  • links whose widths change between ends
  • crossing minimization by randomization
  • cycles
  • more than 3 columns

QA before delivering

  • per-node conservation
  • adjacent-column links only
  • input order preserved
  • source present

Data shape

titleaction title with a number
sourcebottom-left always
uniton first node label
columns[{name, nodes: [{name, value}]}] 2-3 columns
links[{from, to, value}] adjacent columns only
Sample data (golden)
{
  "title": "Road carries 70 of 130 loads; barge stays marginal",
  "eyebrow": "ORIGIN TO ROUTE . JUNE",
  "source": "Source: sample dataset v1, 2026-07-12",
  "unit": "loads",
  "columns": [
    {
      "name": "Origin",
      "nodes": [
        {
          "name": "Supplier A",
          "value": 60
        },
        {
          "name": "Supplier B",
          "value": 40
        },
        {
          "name": "Supplier C",
          "value": 30
        }
      ]
    },
    {
      "name": "Route",
      "nodes": [
        {
          "name": "Road",
          "value": 70
        },
        {
          "name": "Rail",
          "value": 40
        },
        {
          "name": "Barge",
          "value": 20
        }
      ]
    }
  ],
  "links": [
    {
      "from": "Supplier A",
      "to": "Road",
      "value": 35
    },
    {
      "from": "Supplier A",
      "to": "Rail",
      "value": 25
    },
    {
      "from": "Supplier B",
      "to": "Road",
      "value": 25
    },
    {
      "from": "Supplier B",
      "to": "Barge",
      "value": 15
    },
    {
      "from": "Supplier C",
      "to": "Road",
      "value": 10
    },
    {
      "from": "Supplier C",
      "to": "Rail",
      "value": 15
    },
    {
      "from": "Supplier C",
      "to": "Barge",
      "value": 5
    }
  ]
}