Chart 图表
基于 Unovis 的图表组件,涵盖面积 / 柱状 / 折线 / 环图等常规图表,以及漏斗、仪表盘、雷达、迷你图等扩展类型
何时使用
- 需要在后台展示趋势、对比、占比、转化漏斗、核心指标等数据时。
- 希望图表自动跟随应用明暗主题与设计 token(
--chart-*/--vis-*)时。 - 需要 Unovis 未内置、但运营分析常用的图表类型(漏斗图 / 仪表盘 / 雷达图 / 迷你图)时。
导入
图表底层使用 Unovis,使用前需安装 @unovis/vue(npm i @unovis/vue @unovis/ts)。
组件不封装 Unovis:你直接用 VisLine / VisArea / VisGroupedBar / VisStackedBar / VisDonut / VisScatter 等搭建图表,仅在需要时引入 ChartContainer、ChartCrosshair、ChartLegendContent 等增强组件。
快速开始
先用 ChartConfig 声明每个系列的名称与颜色(颜色取自数据色板 var(--chart-N)),再用 Unovis 组件搭建图表。
在此基础上按需叠加 VisAxis(坐标轴)、ChartCrosshair(十字准线提示)、ChartLegendContent(图例)等组件,见下方各类型的完整示例。所有示例都已做响应式布局,随容器宽度自适应。
面积图
用 VisArea 展示趋势,配合 VisAxis 坐标轴、ChartCrosshair(悬停十字准线与提示)与 ChartLegendContent 图例。
柱状图
用 VisGroupedBar 做分组柱状对比;换用 VisStackedBar 即为堆叠柱状。bar-padding / group-padding / rounded-corners 可微调柱形外观。
折线图
用 VisLine 做折线对比;line-width 控制线宽,VisLine 支持多系列数组。
环图 / 饼图
用 VisDonut(VisSingleContainer 内)做占比图;调小 arc-width 即为饼图,中心可叠加 HTML 覆盖层展示汇总值。
提示
ChartCrosshair 缺省使用 ChartTooltipContent 渲染浮层;通过 template + componentToString 可自定义文案(例如隐藏 label、数值千分位)。
十字准线浮层由**容器内的 ChartTooltip(Unovis VisTooltip)**承载:使用 ChartCrosshair 时必须在同一个容器内同时放一个 <ChartTooltip />,否则 hover 不会出现提示浮层。
运营看板
趋势(面积图 + 十字准线 + 图例)+ 转化漏斗 + 指标仪表盘 + KPI 迷你趋势图,一套组合覆盖运营看板的主要诉求。
漏斗图
FunnelChart 为 reui 扩展组件(Unovis 未内置):形状由 SVG 居中梯形绘制,标签用 HTML 覆盖层渲染,保证文字清晰。
指标仪表盘
GaugeChart 基于 Unovis VisDonut 的 angleRange + showBackground 扩展,默认 270° 弧形仪表。
雷达图
RadarChart 为 reui 扩展组件(Unovis 未内置),用于多维度能力/评分对比。
中国地图
ChinaMap 为 reui 扩展组件(Unovis 未内置),用标准 GeoJSON 绘制省级色阶地图:内置墨卡托投影与等比适配,按数值调整填充深浅,支持悬浮提示、名称标签与值域图例。
边界数据通过 geo-json 传入(示例取自 DataV 全国省级 GeoJSON,已精简为文档站静态资源 public/china-geo.json,可直接替换为自有/合规数据);行政区数据默认按 adcode 匹配,其次按名称匹配(广东、广东省 均可)。
迷你图表(Sparkline)
MiniChart 用于卡片、表格中的轻量趋势,无坐标轴与交互,颜色取 currentColor,可直接用文字色类控制。
主题
图表主题完全由 CSS 变量驱动,自动跟随应用明暗主题:
- 数据色板为
--chart-1~--chart-5(对应 shadcn-vue 的图表调色板),ChartConfig里用color: "var(--chart-N)"引用; ChartContainer会把每个系列的颜色注入为--color-{key},因此图表里也可写color="var(--color-desktop)";- reui 把设计 token 映射到 Unovis 变量(
--vis-color*、--vis-axis-*、--vis-tooltip-*等),明暗切换自动生效。
如需定制,在任意作用域覆盖 --chart-* / --vis-* 即可,例如:
API
ChartContainer
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| config | 图表配置 | ChartConfig | {} |
| id | 容器 id(用于作用域样式) | string | 自动生成 |
| class | 附加类名 | string | - |
ChartTooltip
Unovis VisTooltip 的薄封装,承载 ChartCrosshair 的浮层;需与 ChartCrosshair 一起放在图表容器内。
默认不注入 triggers / 延迟,浮层完全由 ChartCrosshair 驱动,因此鼠标在图表内移动时会持续显示(不会因为移到柱子/面积之间的空隙而隐藏)。
triggers、showDelay、hideDelay、allowHover 等 Unovis Tooltip 配置均可直接透传(例如 donut/pie 需要按扇区 hover 时显式传 triggers)。
ChartCrosshair
Unovis VisCrosshair 的封装,用于 XY 图表十字准线提示。需放在 VisXYContainer 内。
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| config | 图表配置 | ChartConfig | 容器注入值 |
| template | 自定义提示模板 | (...args) => HTMLElement | string | ChartTooltipContent |
| labelKey | label 字段 | string | date |
| nameKey | name 字段 | string | - |
| hideLabel | 隐藏 label | boolean | false |
| hideIndicator | 隐藏指示器 | boolean | false |
ChartTooltipContent
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| config | 图表配置 | ChartConfig | - |
| payload | 当前数据项 | object | - |
| indicator | 指示器样式 | dot | line | dashed | dot |
| labelFormatter | 自定义 label 文案 | (payload) => string | - |
| valueFormatter | 自定义值文案 | (value, key) => string | - |
ChartLegend
图例容器(居中排列),内容缺省使用 ChartLegendContent。
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| config | 图表配置 | ChartConfig | 容器注入值 |
| hideIcon | 隐藏图标 | boolean | false |
| indicator | 指示器样式 | dot | line | dashed | dot |
ChartLegendContent
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| config | 图表配置 | ChartConfig | 容器注入值 |
| hideIcon | 隐藏图标 | boolean | false |
| indicator | 指示器样式 | dot | line | dashed | dot |
ChartStyle
把 ChartConfig 的颜色注入为 --color-{key} 变量的样式组件(ChartContainer 内部已使用,一般无需手动引入)。
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| id | 容器 id | string | - |
| config | 图表配置 | ChartConfig | - |
FunnelChart
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| data | 数据(按层顺序) | FunnelDatum[] | - |
| nameKey | 名称字段 | string | name |
| valueKey | 数值字段 | string | value |
| gap | 段间距(% 高度) | number | 1 |
| showLabel | 展示名称 | boolean | true |
| showValue | 展示数值 | boolean | true |
| valueFormatter | 数值格式化 | (value, datum) => string | - |
| height | 高度 | number | string | 280 |
GaugeChart
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| value | 当前值 | number | - |
| max | 量程上限 | number | 100 |
| label | 中心副标题 | string | - |
| color | 进度色 | string | var(--primary) |
| trackColor | 轨道色 | string | var(--muted) |
| arcWidth | 弧宽 | number | 14 |
| angleRange | 角度范围(弧度) | [number, number] | 270° 仪表 |
| valueFormatter | 数值格式化 | (value) => string | 百分比 |
| height | 高度 | number | string | 220 |
RadarChart
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| data | 数据 | RadarDatum[] | - |
| max | 量程上限 | number | 数据最大值 |
| levels | 网格环数 | number | 4 |
| color | 主色 | string | var(--primary) |
| fillOpacity | 填充透明度 | number | 0.25 |
| showLabels | 展示轴标签 | boolean | true |
| height | 高度 | number | string | 280 |
MiniChart
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| data | 数据点 | number[] | - |
| type | 类型 | line | area | bar | line |
| color | 颜色 | string | currentColor |
| strokeWidth | 线宽 | number | 1.5 |
| showLastDot | 显示末点圆点 | boolean | false |
| width | 视口宽度 | number | 120 |
| height | 视口高度 | number | 36 |
ChinaMap
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| data | 行政区数据(按 adcode 优先匹配) | ChinaMapDatum[] | - |
| geoJson | 边界数据(标准 GeoJSON FeatureCollection) | object | - |
| nameKey | 名称字段 | string | name |
| adcodeKey | 行政区划代码字段 | string | adcode |
| valueKey | 数值字段 | string | value |
| color | 数据主色(按数值调整透明度) | string | var(--chart-1) |
| emptyColor | 无数据区域颜色 | string | var(--muted) |
| valueFormatter | 数值格式化 | (value, name) => string | 千分位 |
| showLabels | 展示名称标签 | boolean | false |
| showLegend | 展示值域图例 | boolean | true |
| height | 高度 | number | string | 480 |
工具函数
| 导出 | 说明 |
|---|---|
componentToString | 将组件转成 Unovis tooltip / crosshair 可用模板 |
generateChartStyle | 由 config 生成 --color-* 变量 CSS |
getChartColor | 取某个系列颜色(config → --color-{key}) |
getColorVarMap | 生成 key -> 颜色 映射 |
getPayloadConfigFromPayload | 从 payload 解析配置项 |
