现如今,随着 web2.0 及其相关技术越来越流行,web 矢量图技术也变得越来越重要,尤其是在 web 数据的可视化方面,矢量图技术发挥着不可磨灭的作用。Dojo,一个流行且强大的 web 开发控件库,有着一个专门针对 web 矢量图开发的控件包 -- "dojox.charting",里面封装了很多功能完善的矢量图控件。开发人员只需要基于已有的数据序列,再加上极少量的代码,就可以快速的画出复杂且美观的 web 矢量图形。与此同时,开发人员也可以通过设定相关参数以实现基于矢量图本身的交互效果。"dojox.charting"控件包不仅包括基本矢量图的接口(如:线状图、柱状图、饼状图等等),也包括很多复杂的工业级的矢量图控件(如股票走势图、雷达图、甘特图等等)。这篇文章会介绍一些"dojox.charting"的高级编程技巧,如 x,y 轴的特殊定制,plot 定制的一些特殊的参数,以及 3-D 的矢量图等等,让开发人员能够更加升入的了解 Dojo 的矢量图控件库。
简介
Dojo 有一个非常强大的矢量图组件库—— dojox.charting 组件库,你只需要很少的代码,就能在页面上画出功能强大且美观的矢量图形(如柱状图,饼图等等)。与此同时,对于高级的用户, dojox.charting 也提供了许多定制参数,满足许多更为深层次的需要,如坐标轴的定制,矢量图类型的扩展定制以及基于数据序列(data series)的图形控件的定制。本文着力于探讨 dojox.charting 组件库的这些鲜为人知的高级功能。
高级矢量图
Dojox charting 图库除了很多基本的矢量图外(线图,柱状图等等),还有一些偏向于商业应用行业的图,举其中的 High-low 矢量图和 Candlesticks 矢量图为例:
High-low 矢量图
这种矢量图主要用于查看走势,以下是该图形的例图:
图 1. High-low 矢量图
@H_403_22@ 该图形创建方法如下:清单 1. High-low 矢量图
(new dojox.charting.Chart(node)). addPlot("default",{type: "Candlesticks",gap: 1,minBarSize: 2,maxBarSize: 5 }). addAxis("x",{fixLower: "major",fixUpper: "major",includeZero: true}). addAxis("y",{vertical: true,fixLower: "major",natural: true}). addSeries("Series A",[ { open: 24,close: 8,high: 24,low: 5 },{ open: 8,close: 16,high: 22,low: 2 },{ open: 16,close: 12,high: 19,low: 7 },{ open: 12,close: 20,low: 8 },{ open: 20,................ ],{ stroke: { color: "green" },fill: "lightgreen" } ). render();
Candlesticks 矢量图
这种矢量图比 high-low 图更加完善,更多的用于股票行情走势,以下是该图形的例图:
图 2. Candlesticks 矢量图
@H_403_22@ 该图形创建方法与 high-low 矢量图基本类似,如下:清单 2. Candlesticks 矢量图
Spider 矢量图
这种图俗称蛛网图,又名雷达图。当你需要看到某个对象的一系列属性情况时,雷达图是再适合不过了。比如,需要查看某个人的综合素质(专业素质,管理能力,沟通能力等等),或者某个公司的各项财务指标(主营业务收入,辅助业务收入,营业外收入等等),用雷达图能非常清晰直观明了的看出来其各项指标的情况。雷达图还有一个最为强大的功能:比较不同对象间各个相同属性的优劣,如比较不同人的各项综合素质,又如:比较不同国家的各项经济环境指标。
图 3. Spider 矢量图
@H_403_22@ 如图,可以清晰的看到各个国家(中,法,德,美等等)的各项经济环境指标(GDP 国民生产总值,Population 人口,Inflation 通货膨胀情况等等)。很明显,中国的人口最多,但是国民生产总值很一般。 @H_403_22@ 使用 Spider 矢量图也很容易:清单 3. Spider 矢量图
3-D 图库
Dojo 现在主要支持两种 3-D 矢量图:圆柱状 3-D 和条状 3-D
圆柱状 3-D 图
图 4. 圆柱状 3-D 图
@H_403_22@ 从图上可以看出,它主要包括 3 个数据序列,并分别以红,黄,蓝三种方式呈现,这种 3-D 立体的方式能更加直观的看出趋势以及它们相互之间的差别。其用法也是比较简单的:清单 4. 圆柱状矢量图
条状 3-D 图
条状 3-D 图类似于横向的柱状 3-D 图,其参数配置与柱状 3-D 图基本一致。
矢量图 widget 控件
清单 5. Dojo 矢量图 widget
清单 6. Sparkline 矢量图 widget
Dojo Data 矢量图
所谓 Data Chart,其实有点像 Dojo 的 Data Grid,用过 dojox.grid 的人可能都知道,它其实就是一个基于 dojo.data 的控件,即其数据内容是来自于 dojo.data 对象,通过该对象加载最原始的数据,然后填充到 Dojo chart 中。这种 Data Chart 适用于数据量比较大的情况。
Data 矢量图
图 5. Data 矢量图例图
@H_403_22@ Dojo Data 矢量图支持几乎所有的基本矢量图,其区别主要是它的数据源不再是简单的数组或对象数组,而是一个包装了原始 JSON 数据的 dojo.data 对象。清单 7. 创建 Data 矢量图
清单 8. Data 矢量图数据源的数据结构
Data Series
Data Series 也是基于 dojo.data 构建矢量图数据源序列。在使用 Data Series 时,其它的初始化 Dojo chart 的方式不变,只有在“addSeries”的时候,使用 dojox.charting.DataSeries 对象。
清单 9. 使用 Data Series 序列
Store Series
类似 Data Series,Dojo 矢量图还能够基于 dojo.store 构建数据源序列。
图 6. Dojo 矢量图(Store Series)例图
@H_502_197@ 清单 10. 使用 Store Series 序列特殊定制参数
Dojo 矢量图中其实有很多地方是可以定制的,但是由于种种原因,这些定制参数可能并不为人所知,这里我们来详细讨论一下这些参数。
手动触发图形的相关事件
使用过 Dojo 矢量图的人可能知道,Dojo 矢量图可以加入很多交互效果,它支持鼠标的 onmouSEOver,onmouSEOut,onclick 等等交互事件。
图 7. Dojo Chart fire event 例图
@H_403_22@ 图 7 说明,对“Series 3”的第 3 段手动执行“mouSEOver”的操作,于是该区域(红框)会出现和鼠标悬停在上一样的效果。其使用方式其实很简单:清单 11. chart.fireEvent 介绍
数据序列中支持空 ("Null") 值
其实这是 Dojo 矢量图的内置功能,并不需要程序员额外的参数配置。
图 8. “NULL”值的例图
@H_403_22@ 程序员只需要给没有数据的地方置“null”即可。清单 12. “NULL”的用法
对图形块和数据序列的重新排序
Dojo 矢量图支持多个图形区域(plot),即在一个矢量图上可以显示多种类型的矢量图,如线状图和柱状图并存,多个泡状图并存。这些图形区域均有一定的前后关系。
图 9. 多个 Bubble plot 的 Dojo chart
@H_403_22@ 由图 9 可见,最先渲染的 plot1 离原点最近。如果我们改变它们的顺序,则显示方式会变化,见图 10。(chart.setPlotOrder(["plot2","plot1","plot3"]) 或者 chart1.movePlotToFront("Plot1"))图 10. 重新排序 plot 后的多 Bubble plot 的 Dojo 矢量图
@H_403_22@ 可见,顺序变成了红 1,绿 2,蓝 3,于是红色的 plot 离原点最近。 @H_403_22@ 其实,dojo 矢量图的 plot 对应的数据序列 series 也能排序,其中排在最前面的会显示在最上方,然后依次遮盖排在后面的 series。(chart.setSeriesOrder(["plot2","plot3"]) 或者 chart1.moveSeriesToFront("Plot1"))图 11. 重新排序 series 后的多 Bubble plot 的 Dojo 矢量图
坐标轴 (Axis) 的高级定制
关于 Dojo 矢量图坐标轴的定制也有很多高级用法。
清单 13. 坐标轴 label 旋转
图 12. 旋转的 label
@H_403_22@ 坐标轴标签(label)不仅能旋转,还可以截断,这对于比较长的 label 相当有效。清单 14. 坐标轴标签(label)截断
图 13. 截断的 label
@H_403_22@ 而且,在 dojo1.6 中引入了 Dojo 矢量图标题和坐标轴标题,其设定也很简单,如下:清单 15. Dojo 矢量图标题
清单 16. 坐标轴 标题
图 14. Dojo chart 的标题
@H_403_22@ 另外,在一个矢量图中,可以随时隐藏坐标轴清单 17. 坐标轴隐藏
Tension 的定制
Tension 字面上讲是“张力”的意思,其实这在 Dojo 矢量图里面主要用于对线状图的定制,点与点之间可以用直线连接,也可以用曲线甚至贝叶斯曲线的方式连接。
清单 18. Tension 定制
图 15. Tension 定制效果
矢量图皮肤的定制
可以通过“dojox/charting/tests/test_themes.html”案例来查看 Dojo 皮肤的效果,进而选择相应的自己喜欢的皮肤
图 16. 皮肤定制
@H_403_22@ 所有“dojox.charting.themes”下面的对象都是 Dojo 支持的皮肤类型,开发人员只需要“charts.setTheme(dojox.charting.themes.claro).render();”一句话即可实现皮肤的切换。结束语
这篇文章介绍了 Dojo 开发中关于 Dojo 矢量图开发的一些更深层次的知识,基于 Dojo 的实例源代码,阐述了 Dojo 矢量图控件的很多高级功能,高级参数的定制以及高级对象的使用方式等等,同时,也介绍了 Dojo 矢量图数据源的多种定制方式,包括与 dojo.data,dojo.store 结合的方式。最后还提到了一些比较特殊的定制参数,这些大小细节我们可以在开发过程中尽量注意一下,以尽可能多的完善我们的 Web 应用。
原文链接:
http://www.ibm.com/developerworks/cn/web/1109_zhouxiang_dojocharting/