نمودار Sankey (PartoSankeyChart)
نمودار جریان (flow) بین گرهها — ضخامت اتصال نشاندهنده میزان جریان است. مناسب برای نمایش مسیر داده در افکارسنجی.
معرفی
PartoSankeyChart یک نمودار جریان است که نشان میدهد «چقدر» از یک گره به گره دیگر منتقل میشود. ضخامت هر اتصال متناسب با مقدار جریان است.
چه زمانی استفاده کنیم:
- جریان دیدگاه: منبع (رسانه) → احساس (موافق/مخالف/خنثی)
- قیف تبدیل: ورودی → مراحل فرآیند → خروجی
- نمایش multi-stage split/merge (برای افکارسنجی: source → category → sentiment)
- تحلیل مسیر (user journey flow)
چه زمانی استفاده نکنیم:
- وقتی گرهها گراف acyclic ندارند (حلقه دارند) — از
PartoNetworkChartاستفاده کنید - سری زمانی — از
PartoLineChart - توزیع سهم — از
PartoPieChart
زمین بازی
با تغییر تنظیمات زیر، پیشنمایش زنده را مشاهده کنید.
استفاده
'use client'
import { PartoSankeyChart } from '@parto-system-design/ui'
const nodes = [
{ name: 'اخبار' },
{ name: 'شبکه اجتماعی' },
{ name: 'موافق' },
{ name: 'مخالف' },
]
const links = [
{ source: 0, target: 2, value: 45 }, // اخبار → موافق
{ source: 0, target: 3, value: 20 }, // اخبار → مخالف
{ source: 1, target: 2, value: 55 }, // شبکه → موافق
{ source: 1, target: 3, value: 60 }, // شبکه → مخالف
]
<div style={{ height: 340 }}>
<PartoSankeyChart nodes={nodes} links={links} />
</div>حالتها و انواع
جریان منبع → احساس
سادهترین حالت دومرحلهای: از منبع (پلتفرم، رسانه) به سمت احساس کلی (موافق/مخالف/خنثی). برای bulletin افکارسنجی روزانه استفاده کنید.
const nodes = [
{ name: 'توییتر' },
{ name: 'اینستاگرام' },
{ name: 'تلگرام' },
{ name: 'موافق' },
{ name: 'خنثی' },
{ name: 'مخالف' },
]
const links = [
{ source: 0, target: 3, value: 30 },
{ source: 0, target: 4, value: 15 },
{ source: 0, target: 5, value: 25 },
{ source: 1, target: 3, value: 50 },
{ source: 1, target: 4, value: 10 },
{ source: 1, target: 5, value: 20 },
{ source: 2, target: 3, value: 18 },
{ source: 2, target: 5, value: 22 },
]
<PartoSankeyChart nodes={nodes} links={links} />جریان چندمرحلهای — پلتفرم → موضوع → احساس
برای تحلیل عمیقتر میتوانید سه ستون یا بیشتر داشته باشید. الگوریتم layout هر ستون را بهصورت خودکار تشخیص میدهد.
const nodes = [
{ name: 'توییتر' }, { name: 'اینستاگرام' },
{ name: 'اقتصاد' }, { name: 'سیاست خارجی' }, { name: 'فرهنگ' },
{ name: 'موافق' }, { name: 'مخالف' },
]
const links = [
{ source: 0, target: 2, value: 40 },
{ source: 0, target: 3, value: 20 },
{ source: 1, target: 2, value: 25 },
{ source: 1, target: 4, value: 30 },
{ source: 2, target: 5, value: 35 },
{ source: 2, target: 6, value: 30 },
{ source: 3, target: 6, value: 20 },
{ source: 4, target: 5, value: 30 },
]
<PartoSankeyChart nodes={nodes} links={links} />رنگ سفارشی روی گره با theme-aware token
با color روی هر گره میتوانید رنگ token-based پاس دهید تا در dark/light بهدرستی switch شود. برای جریانهایی که معنی رنگی دارند (مثلاً سبز=موافق) استفاده کنید.
const nodes = [
{ name: 'منبع' },
{ name: 'موافق', color: 'hsl(var(--sentiment-positive))' },
{ name: 'مخالف', color: 'hsl(var(--sentiment-negative))' },
{ name: 'خنثی', color: 'hsl(var(--sentiment-neutral))' },
]
const links = [
{ source: 0, target: 1, value: 45 },
{ source: 0, target: 2, value: 30 },
{ source: 0, target: 3, value: 25 },
]
<PartoSankeyChart nodes={nodes} links={links} />تنظیم spacing و عرض گرهها
برای جریانهای شلوغ میتوانید با nodePadding فاصله عمودی بین گرهها و با nodeWidth عرض مستطیل گره را تنظیم کنید.
<PartoSankeyChart nodes={nodes} links={links} nodeWidth={20} nodePadding={32} />حالت خالی
<PartoSankeyChart nodes={[]} links={[]} />راهنمای استفاده
بکنید
- برای دادههای flow و transition استفاده کنید — منبع → دسته، احساس → اقدام، یا قیف چندمرحلهای. - گرهها را بهصورت
acyclic (بدون حلقه) و در لایههای مشخص نگه دارید تا الگوریتم layout بهینه کار کند. - مقادیر
valueرا به یک واحد یکسان (تعداد، درصد، حجم) محدود کنید تا ضخامت اتصالها قابل مقایسه باشد.
نکنید
- وقتی مجموعه source/target از حدود ۱۵ گره فراتر میرود استفاده نکنید — برچسبها روی هم میافتند و خوانایی از بین
میرود. - برای سری زمانی استفاده نکنید — از
PartoLineChartاستفاده کنید. - برای گراف غیر-acyclic (با حلقه) استفاده نکنید — ازPartoNetworkChartاستفاده کنید.
Props
SankeyNode / SankeyLink
دسترسیپذیری
- wrapper با
role="img"+aria-labellocalized. - tooltip برای هر link وقتی hover میشود — نشاندهنده
source → target: value. - empty-state اگر nodes/links خالی باشند، EmptyChart رندر میشود.
کامپوننتهای مرتبط
- PartoNetworkChart — برای گراف آزاد (غیر-acyclic)
- PartoPieChart — برای نمایش سهم در یک سطح
- PartoBarChart — برای مقایسه ساده دستهها