[关闭]
@kungfuboy 2017-02-24T09:42:04.000000Z 字数 1441 阅读 1555

数据可视化——D3

技术栈


数据可视化,是指将大量的数据处理后归类,并在视觉层面做出差异分明的展示。

说得学术一些,数据可视化分为七个步骤:获取、分析、过滤、挖掘、表现、改善、交互。(出自《Visualizing Data》),前面几步我们通过Ajax请求和业务函数来实现,作为一个库,我们着重进行数据渲染,也就是后三步:表现、改善、交互。

对于Web来说,能在页面上画图的只有两个东西——Canvas和SVG。

两者各自的侧重点还是比较明显的:

先说Canvas,Canvas是HTML5的一个接口,或者说是个标签吧,可以利用它里面的一些方法和属性,绘制出图形,渲染的时候是逐个像素地渲染。并且,它是基于位图的图像,因此不能够改变大小,只能缩放显示,也由此带来一个缺点,它对于文字的渲染能力弱。此外,它不支持事件处理器。

因此,Canvas适合图像密集型的游戏,或者说动画精细、幅度变化大的动画效果。

SVG则是基于XML的图,尽管它同样也属于文档结构,但和DOM不一样,挂在XML的节点上的属性少,因此渲染的代价要小得多,当然,在复杂度相当高的节点操作下,它跟Canvas相比还是吃力的。

说得直白一些,如果你要绘制一张脸,那Canvas更合适,如果你要绘制一些比较规则的图形,那SVG更合适。此外,SVG更容易操作,当然,我们直接选用已经成型的类库,关于操作性就不用比较了。

现如今,数据可视化的类库并不少,像比较知名的百度的Echarts,谷歌的Chart,还有HeightCharts等。上述几个库的使用方式大致是一样的。如下:

  1. var data = {
  2. name:'',
  3. age:''
  4. }
  5. var pie = new Pie();
  6. pie.setOption(data);

创建一个构造函数,随后调用API,在其中传入一个json对象,json里按你的需要放入数据。

然而,这些库的定制性并不高,例如想要改变初始化的展现方式、修改坐标轴的间距、修改色盘等都是比较复杂的事,在图表比较复杂的时候,这些类库绘制出来的图往往达不到要求,细微的部分无法修改。

因此,很自然地把眼光放在那些定制性更强的类库上——D3,说实话这个选择的过程是毫无痛苦的,因为除了D3几乎没什么能选的,Three.js倒是个选择,可以绘制出3D的漂亮图形,但是接口复杂,况且现在3D绘图尚未成熟,Three也少用于生产。

D3用的是SVG。

D3支持事件处理器,并且是数据驱动的,也就是说只需要关心数据以什么样的形式加载即可,修改XML节点的事情交给D3做,这大大减少了工作量(好吧,其实所有的同类库都是这么做的)。D3将“绘制什么”和“如何绘制”分了开来,和其他类库比,表面上看这增加了工作量,但这可以让绘制出来的库更加贴近业务,视觉上也可以更有追求。

在使用上,D3的语法并不高深,语法类似于JQuery,这大大减少了学习成本,只需要了解各个API的参数和作用,就可以上手工作了。(只是他们也像JQuery一样把读方法和写方法写在一起,否则这个库还可以更轻量一些。)

image_1b9ndimvp13cnof3i3u1d8h1jdd9.png-55.6kB

在Github上,D3的排名现在甚至比react和angular更靠前,让同类的库望尘莫及。

关注度高,那么解决问题的效率也会高,况且D3已经出现好几年了,基本成熟稳定。

image_1b9ne2bmg1oq4ns013fk1k8tdfg1g.png-71.7kB

如图,1873个问题,已经全部被解决,找Google的Chart来对比一下就知道这意味着什么……

image_1b9ne73821d21om31sr0d6ojhi1t.png-80.9kB

Charts有2600多个坑,其中有200多个未解决。

更多人的选择,直接代表了更火热的社区、更完善的文档资料、更多的技术支持。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注