KityCharts 提供构建数据可视化产品的机制和工具,不提供具体数据可视化的产品。源码里的 charts 目录是一些示例和参考。
KityCharts 主要包括三个部分的内容:组件(Component)、工具(Utility)、数据(Data)
要使用 KityCharts 构建一个数据可视化的图表,需要关心:
- 我的数据都是什么格式
- 我需要用什么组件来呈现我的数据
- 我如何把我的数据变成组件需要的参数
一个数据可视化产品的更新流程是这样的:
- 数据发生变化(
Data.update()
) - Chart 的 update 方法被触发(
Chart.update()
)- 获取最新的数据
- 格式化数据
- 利用数据更新包含的组件
对于很多时候,前后端的数据格式可能不是一致的。需要明确概念:后端返回的数据叫做原始数据
,而直接驱动数据可视化产品的数据叫做标准数据
。
从原始数据
到标准数据
的转换过程称为数据格式化
。从原始数据到标准数据的转换,可能会涉及到数据的拆分、聚合、分组等操作。
建议每个数据可视化产品都定义一种标准数据,因为这样以后想要适应不同的原始数据的时候,只需要重新定义数据格式化的过程即可。
数据格式化通过继承 Data 类实现,只需要复写 format 方法即可。
对于每一个组件,都有其参数,比如高度、颜色、角度、文本等。图表应该把标准数据分发映射到组件的参数里,然后调用其 update 方法。KityCharts 内置了一些简单的组件,比如 Label、Tooltip、Categories、Line、Mesh 等。
提供的组件不一定能满足所有数据可视化产品的需求,很多时候需要拓展原有组件或者开发新的组件。KityCharts 组件有一套约定的更新机制,开发组件应该遵循这套机制。
-
确定组件的参数,组件的外观全部由这套参数来控制,比如 color、height、size 等。
-
确定更新规则,更新规则通过实现 registerUpdateRules 方法来实现,并且注意和父类的规则合并:
registerUpdateRules: function() { return kity.Utils.extend(this.callBase(), { updateSize: [ 'size' ], updateStyle: [ 'color', 'font' ] }); }, updateSize: function( size ) { }, updateFont: function( color, font ) { }
-
调用组件的
update( param )
方法时,会是以下的过程:- param 参数作为更新参数列表,如果为空,以当前组件参数(this.param)为更新参数列表
- 如果是首次更新,会把现有的参数加到更新参数列表中,并且获取更新规则(调用 registerUpdateRules())
- 对于每一条更新规则,使用规则去更新参数:
- 规则中的参数有至少一个被包含在如果更新参数列表中,继续下一步,否则结束更新
- 使用规则中的方法名,得到更新方法,并且把参数列表中的参数按规则指定的顺序传到更新方法中更新。如果更新参数列表中缺少规则中需要的参数,则从给出组件当前参数对应的值
- 对于更新参数中未匹配更新规则的参数,会去查找组件中是否有键值和参数名称同名的子组件,如果有,用该参数更新子组件
这套更新机制解决了以下问题:
- 强制拆分组件的更新方法,比较好维护
- 让组件可以局部更新,而且不需要关心什么时候更新哪个局部
- 自动判断是否无效更新,如果参数没有变,不调用更新方法
对于一些组件,如果有支持动画的参数,可以从 AnimatedChartElement 继承,就能自动拥有动画接口。你需要实现 getAnimatedParam() 接口,告诉 AnimatedChartElement 那些参数是可以被用于做动画的。
getAnimatedParam: function() {
// 默认 x, y 属性是支持动画的,这两个参数无需再告知。
return ['height', 'percent'];
}
从 AnimatedChartElement 继承的组件,使用 animate 方法可以使用动画去更新参数。不支持动画的参数也可以用这个方法去更新,会自动改用 update 方法来更新。
数据可视化产品很多情况下会处理数据序列,这些序列会增长、减少,以及序列中的元素也会发生变化。ElementList
是专门为这种需求设计的。
它也是一个 ChartElement
,有三个参数:elementClass
、list
、common
。
- elementClass: 指定序列中的每个元素应该用哪一个组件来渲染
- list: 组件的参数列表
- common: 组件的公共参数
当 list 发生更新的时候,会自动增加或减少组件来适应 list 的长度,然后对于每一个组件,用 list 中的参数来一一更新。如果 elementClass 是支持动画的组件类,则会使用动画来更新。
内置的 Categories、Mesh 都使用到了 ElementClass。