Sankey Chart
通过连接节点与按权重分配的带状路径追踪阶段间流向。
适用场景
- 当界面需要以下行为时使用 Sankey Chart:通过连接节点与按权重分配的带状路径追踪阶段间流向。
安装
选择安装方式,用法示例将同步更新导入路径。
$ bunx --bun shadcn-vue@2.8.2 add https://orvui.efu.me/r/sankey-chart.json https://orvui.efu.me/r/tabs.json
首次使用时,将安装的 src/components/orvui/styles.css 导入项目样式入口。
示例
预览
| Flow | Value | Share of source |
|---|---|---|
| Subscriptions to Revenue | $70M | 100.0% |
| Services to Revenue | $17M | 100.0% |
| Marketplace to Revenue | $14M | 100.0% |
| Revenue to Cost of revenue | $36M | 35.6% |
| Revenue to Gross profit | $65M | 64.4% |
| Gross profit to R&D | $22M | 33.8% |
| Gross profit to Sales & marketing | $17M | 26.2% |
| Gross profit to G&A | $7M | 10.8% |
| Gross profit to Operating profit | $19M | 29.2% |
packages/vue/src/charts/sankey-chart/demo.vue
<script setup lang="ts">
import { ref } from "vue";
import { Tabs, TabsList, TabsTrigger } from "@/components/orvui/motion/tabs";
import { SankeyChart, type SankeyNode, type SankeyLink } from "@/components/orvui/charts/sankey-chart";
const nodes: SankeyNode[] = [
{ id: "subscriptions", label: "Subscriptions", color: "#2563eb" },
{ id: "services", label: "Services", color: "#38bdf8" },
{ id: "marketplace", label: "Marketplace", color: "#6366f1" },
{ id: "revenue", label: "Revenue", color: "#64748b" },
{ id: "cost", label: "Cost of revenue", color: "#e11d48" },
{ id: "gross", label: "Gross profit", color: "#0d9488" },
{ id: "rnd", label: "R&D", color: "#f59e0b" },
{ id: "sales", label: "Sales & marketing", color: "#fb923c" },
{ id: "admin", label: "G&A", color: "#fbbf24" },
{ id: "operating", label: "Operating profit", color: "#16a34a" },
];
function income([
subscriptions,
services,
marketplace,
cost,
rnd,
sales,
admin,
]: number[]): SankeyLink[] {
const revenue = subscriptions + services + marketplace,
gross = revenue - cost;
return [
{ source: "subscriptions", target: "revenue", value: subscriptions },
{ source: "services", target: "revenue", value: services },
{ source: "marketplace", target: "revenue", value: marketplace },
{ source: "revenue", target: "cost", value: cost },
{ source: "revenue", target: "gross", value: gross },
{ source: "gross", target: "rnd", value: rnd },
{ source: "gross", target: "sales", value: sales },
{ source: "gross", target: "admin", value: admin },
{
source: "gross",
target: "operating",
value: gross - rnd - sales - admin,
},
];
}
const quarters = {
q2: income([62, 18, 10, 34, 20, 16, 7]),
q3: income([70, 17, 14, 36, 22, 17, 7]),
};
const quarter = ref<keyof typeof quarters>("q3");
const currency = (value: number) => `$${value.toLocaleString("en-US")}M`;
</script>
<template>
<div class="w-full max-w-3xl space-y-4">
<Tabs v-model="quarter" variant="segment"
><TabsList
><TabsTrigger value="q2">Q2</TabsTrigger
><TabsTrigger value="q3">Q3</TabsTrigger></TabsList
></Tabs
><SankeyChart
:nodes="nodes"
:links="quarters[quarter]"
:format-value="currency"
:label="`Income statement, ${quarter.toUpperCase()}`"
/>
</div>
</template>
packages/vue/src/charts/sankey-chart/src/SankeyChart.vue
状态与事件
需要由表单、路由或父组件管理时,绑定下列状态并接收对应更新。v-model 是属性与 update 事件的简写;值的类型应与 API 一致。
| 组件 | Vue 绑定 | 更新事件 |
|---|---|---|
SankeyChart | v-model:activeIdnull | string | update:activeId |
可选受控属性未传入时,按组件文档的默认行为工作;不要用固定的 false 或空值代替未传入。异步请求和持久化在应用中处理,再把结果传回组件。
API 参考
SankeyChart
nodesreadonly SankeyNode[]—linksreadonly SankeyLink[]—label?string"Sankey chart"formatValue?(value: number) => stringformatNumbercolors?readonly string[]SANKEY_COLORSnodeWidth?number12nodePadding?number16activeId?null | string—defaultActiveId?null | stringnullclassName?string—事件
update:activeId—@update:activeIdactiveChange—@activeChange插槽
default() => VNodeChild#defaultSankeyChartPlot
showValues?booleantrueSankeyChartTooltip
side?"top" | "bottom" | "left" | "right""top"插槽
default—作用域参数: active
#default无障碍
为交互控件提供明确的无障碍名称。保留文档中的键盘路径、可见焦点与减少动态效果状态;自定义插槽应继续保留所替代部件的语义。
常见问题
- 如何配置 Sankey Chart?
- 通过 nodes、links、label、formatValue、colors、nodeWidth、nodePadding、activeId、defaultActiveId、className 配置 Sankey Chart;API 表列出其类型与默认值。
- 如何连接到应用状态?
- 监听 update:activeId、activeChange,将组件连接到应用状态。
- 可以在服务端渲染吗?
- 可以在 Vue SSR 应用中正常渲染。服务端与客户端的初始 props 应保持一致;浏览器测量与交互资源在挂载后启动。
更新于
来源与许可 ↗MIT · 0.1.1