ice-chart · 交互式图表库(当前 v0.23.4)
🧩 应用层 · 基于 ice-render 引擎 v2.14.1 封装(当前 v0.23.4)
本页属于 ice-render 家族的应用层产品:图表层只声明「数据 → 像素 → 语义事件」,命中测试与事件派发全部交给引擎内核。想了解底层引擎本身,请看左侧「ice-render 引擎」分组。
ice-chart 是构建在 ice-render 引擎之上的交互式图表库(当前 @damoqiongqiu/ice-chart v0.23.4)。 它不是「把数据画成图」的又一个图表库——命中测试、事件派发、嵌套坐标系、脏矩形局部重绘全部交给 ice-render 引擎,图表层只负责把「数据 ↔ 像素 ↔ 语义事件」这三件事打通。
于是悬停高亮、点击下钻、框选缩放、缩放平移、图例联动、跨图联动、键盘导航都是内建能力,而不是事后打补丁的插件——因为每一个系列组件都实现了 containsLocalPoint,把「画出来什么样」和「点得到哪里」统一在同一份像素缓存里。
MIT License · 作者:大漠穷秋(damoqiongqiu@126.com)
一个完整的实时大屏例子(就是仓库里的 examples/dashboard-market.html)
下面这个例子直接由文档静态托管的 ice-render + ice-chart UMD 运行时在文档页里画出(无需联网):行情监控大屏(K 线、深度、资金流、板块、委托队列等一整屏图表),所有交互(悬停十字准星、框选缩放、图例联动、键盘导航)都由引擎内建。
这就是 ice-chart 的核心卖点:图表层不碰 DOM 事件,只声明「数据 → 像素 → 语义事件」,命中与派发全部由引擎承担。 同一份引擎实例池还能让多张图共享统一的事件语义,跨图联动因 此水到渠成。
核心能力
| 能力 | 说明 |
|---|---|
| 图表类型 | 折线 / 面积 / 柱状 / 堆叠柱 / 饼 / 玫瑰 / 雷达 / 仪表盘 / 漏斗 / 水位球 / 散点 / 气泡 / 箱线 / 桑基 / 关系图 / 树图 / 热力 / K 线 / 时序等,均基于 ice-render 图元 |
| 内建交互 | 悬停高亮 + 压暗其它系列、点击下钻、框选缩放、滚轮缩放、拖拽平移、图例联动、跨图联动、键盘导航——命中由引擎承担,0 插件成本 |
| 设计语言 | 直接采用 Bootstrap 5 调色板与令牌(--bs-border-radius、--bs-body-font-family 等);数据系列配色与引擎共用一份(CHART_PALETTE 直接 import 引擎的 FAMILY_PALETTE),换肤只需覆盖 theme.colorPalette 或派生 BOOTSTRAP_TOKENS |
| 大屏脚手架 | dash-kit 1~12 列栅格 + 一套空间利用率审计(墨迹横向占宽 / 图形直径占分配直径门禁),避免「右侧浪费太多」 |
| 像素契约 | rebuildPixels() 重算一次点集,render() 与 hitTestIndex() 消费同一份缓存——「看得见的点」与「点得到的点」不可能漂移 |
| 标注图层 | option.annotation:目标线 / 阈值线、异常点、目标区间。声明式、纯数据可序列化,定位走坐标轴比例尺(随缩放 / 平移 / 联动走),默认不吃命中;越界不画但给结构化诊断 |
| AI Agent DSL | ice-chart-dsl:一张表 + encoding 直接编译成 ChartOption,带结 构化诊断(见下节) |
0.19.0 → 0.20.0 值得注意的点
option.labels:内置文案可覆盖(i18n 友好)。图表内建 UI 文本(无障碍标题、扇区 / 数值 / 占比、坐标读数、液位等)由一份ChartLabels默认表提供,应用层通过option.labels整体覆盖即可换语言 / 换措辞,图表包本身不做 i18n 运行时——与引擎「引擎不做 i18n」的契约一致。- 类型注册已命名空间化到
ice-chart:*。ICEChart 把内部图元(PlotArea / GridLines / Axis / Legend / Title / Tooltip / Crosshair / Highlight / Brush 等)注册为ice-chart:PlotArea这类 canonical typeId,与引擎的ice-render:*、设计器的ice-entity-designer:*互不撞名,序列化 / 反序列化安全。 - 标注
option.annotation(0.20.0):目标线 / 阈值线 / 异常点 / 目标区间都是坐标系上的一个图层——{ lines: [{ axis: 'y', value: 150, text: '目标 150' }], points: [...], areas: [...] }。值用数据值(数值轴写数字、类目轴写类目名),所以跟着缩放 / 平移走,不进图例、不占数据下标、不抢命中;越界不画,原因进chart.annotationDiagnostics()。