Sankey и Chord
Потоковые серии: рёбра fromField → toField с весом sizeField.
Sankey
Узлы раскладываются по колонкам топологической глубины, толщина связей пропорциональна потоку.
ts
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';
export function createOptions(): ChartOptions {
return {
data: getData(),
title: { text: 'User journey' },
series: [{ type: 'sankey', fromField: 'from', toField: 'to', sizeField: 'value' }],
legend: { enabled: false },
};
}ts
export function getData() {
return [
{ from: 'Traffic', to: 'Organic', value: 620 },
{ from: 'Traffic', to: 'Ads', value: 380 },
{ from: 'Organic', to: 'Sign-up', value: 240 },
{ from: 'Ads', to: 'Sign-up', value: 190 },
{ from: 'Organic', to: 'Bounce', value: 380 },
{ from: 'Ads', to: 'Bounce', value: 190 },
{ from: 'Sign-up', to: 'Subscription', value: 160 },
{ from: 'Sign-up', to: 'Freemium', value: 270 },
];
}Подписи и настройка узлов
label (шрифт, цвет, formatter({ name, total })), node.width/node.spacing и linkOpacity:
ts
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';
export function createOptions(): ChartOptions {
return {
data: getData(),
title: { text: 'Budget flow' },
subtitle: { text: 'labels with totals, wide nodes, dense links' },
series: [
{
type: 'sankey',
fromField: 'from',
toField: 'to',
sizeField: 'amount',
node: { width: 14, spacing: 24 },
linkOpacity: 0.5,
label: {
fontSize: 12,
fontWeight: 'bold',
formatter: ({ name, total }) => `${name} · ${total}K`,
},
},
],
legend: { enabled: false },
};
}ts
export function getData() {
return [
{ from: 'Salary', to: 'Budget', amount: 220 },
{ from: 'Freelance', to: 'Budget', amount: 60 },
{ from: 'Budget', to: 'Rent', amount: 90 },
{ from: 'Budget', to: 'Food', amount: 70 },
{ from: 'Budget', to: 'Transport', amount: 30 },
{ from: 'Budget', to: 'Savings', amount: 90 },
{ from: 'Savings', to: 'Investments', amount: 60 },
{ from: 'Savings', to: 'Emergency fund', amount: 30 },
];
}Chord
Узлы по кругу, ленты — взаимные потоки.
ts
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';
export function createOptions(): ChartOptions {
return {
data: getData(),
title: { text: 'Calls between services' },
series: [{ type: 'chord', fromField: 'from', toField: 'to', sizeField: 'calls' }],
legend: { enabled: false },
};
}ts
export function getData() {
return [
{ from: 'API', to: 'Auth', calls: 320 },
{ from: 'API', to: 'Billing', calls: 180 },
{ from: 'Web', to: 'API', calls: 540 },
{ from: 'Mobile', to: 'API', calls: 410 },
{ from: 'Billing', to: 'Auth', calls: 90 },
{ from: 'Web', to: 'Auth', calls: 130 },
];
}Отступы и подписи
nodeSpacing — зазор между дугами (px по внутреннему радиусу), linkOpacity — плотность лент, label.formatter получает имя и сумму узла:
ts
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';
export function createOptions(): ChartOptions {
return {
data: getData(),
title: { text: 'User migration between platforms' },
subtitle: { text: 'nodeSpacing: 28, dense ribbons, labels with totals' },
series: [
{
type: 'chord',
fromField: 'from',
toField: 'to',
sizeField: 'users',
nodeSpacing: 28,
linkOpacity: 0.55,
label: {
fontSize: 12,
formatter: ({ name, total }) => `${name} (${total})`,
},
},
],
legend: { enabled: false },
};
}ts
export function getData() {
return [
{ from: 'Web', to: 'iOS', users: 18 },
{ from: 'Web', to: 'Android', users: 22 },
{ from: 'iOS', to: 'Web', users: 9 },
{ from: 'Android', to: 'Web', users: 12 },
{ from: 'iOS', to: 'Android', users: 6 },
{ from: 'Android', to: 'iOS', users: 7 },
{ from: 'Web', to: 'Desktop', users: 10 },
{ from: 'Desktop', to: 'Web', users: 5 },
];
}Опции
Общие опции всех серий (name, showInLegend, tooltip.renderer, …) — в разделе Общие опции серий.
| Опция | Серии | Описание |
|---|---|---|
fromField | обе | рёбра графа потоков |
toField | обе | рёбра графа потоков |
sizeField | обе | рёбра графа потоков |
fills | обе | цвета узлов по кругу палитры |
Полный список опций
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
linkOpacity | обе | 0.35 | прозрачность лент потоков |
nodeSpacing | chord | 12 | зазор между дугами узлов, px |
label.enabled | boolean | true | подписи узлов |
label.formatter | ({ name, total }) => string | имя узла | содержимое |
label.fontSize | Pixels | 11 | размер шрифта подписи |
label.fontWeight | string | number | normal | насыщенность |
label.fontFamily | string | шрифт темы | гарнитура |
label.color | ColorValue | foreground | цвет |
node.width | Pixels | 14 | ширина узла sankey |
node.spacing | Pixels | 14 | вертикальный зазор узлов sankey |