【 随笔 】 D3 难吗?
有不少朋友说学 D3 挺难的。为什么呢?想写一篇文章分析分析。
1. D3 出现的背景
D3.js 是 Github 上的一个开源项目,用于数据可视化。作者是 Mike Bostock,纽约时报的工程师。现纽约时报上各种数据新闻的可视化图表,都是基于 D3 制作的。
数据新闻,是近年来十分热门的一个行业,在互联网新闻里,添加上生动的数据分析,以图形的形式展示,简单易懂。
数据新闻是随着大数据时代的潮流而出现。各公司和机构能掌握的数据越来越多,例如谷歌掌握了数以千万亿的搜索数据,沃尔玛掌握了全球的零售数据。如此大量的数据,在以前要处理是难以想象的,大部分数据或者没有保存下来,或者保存下来了也不受重视,因为数据太多处理不了。
但是,如今计算机的能力已大幅度提高,硬件基础不再成为问题,使用大数据来分析问题自然而然也成为了趋势,因此目前被称为大数据时代。关于大数据是什么,可参见我总结的文章:
【 大数据时代需要转变的思维 】
对于大量数据的处理中,有数据获取、数据分析、数据简化等等,还有数据可视化。数据可视化是将数据呈现给用户的方式。请问,你是看图像舒服,还是看一堆数字舒服?
D3 就是在这种趋势下诞生的。当然,与之一起诞生的可视化库还有很多,例如,processing.js、echarts等。但是,D3 绝对可称得上是该领域的佼佼者,关于各种 JavaScript 库流行度的分析,可阅读:
2. D3 的优势
可视化的库有很多,基于 JavaScript 开发的库也有很多,D3 有什么优势呢?
(1)数据能够与 DOM 绑定在一起
D3 能够将数据与 DOM 绑定在一起,使得数据与图形成为一个整体,即图形中有数据、数据中有图形。那么在生成图形或更改图形时,就可以方便地根据数据进行操作,并且,当数据更改之后,也能简单地更改图形。
(2)数据转换和绘制是独立的
将数据变成图表,需要不少数学算法。很多可视化库的做法是:
提供一个函数 drawPie() ,输入数据,直接绘制出饼状图。
但 D3 的做法是:
提供一个函数 computePie(),可将数据转换成饼状图的数据,然后开发者可使用自己喜欢的方式来绘制饼状图。
虽然看起来 D3 使得问题变得麻烦了,但是在图表要求比较复杂的时候,直接绘制的饼状图往往达不到要求,细微的部分没有办法更改。而 D3 将两者分离开来,就极大地提高了自由度,以至于开发者甚至可以使用其他的图形库来显示 D3 计算的数据。
(3)代码简洁
JQuery 是网页开发中很常用的库,其中使用了链式语法,被很多人喜爱。D3 也采用了这一语法,能够一个函数套一个函数,使得代码很简洁。
(4)大量布局
饼状图、树形图、打包图、矩阵树图等等,D3 将大量复杂的算法封装成一个一个”布局“,用于转换数据。能够适用于各种图表的制作。
(5)基于SVG,缩放不会损失精度
SVG,是可缩放的矢量图形。D3 的绘制大部分是在 SVG 上绘制的,并且提供了大量的图形生成器,使得在 SVG 上生成图形变得简单。
另外,由于 SVG 是矢量图,放大缩小不会有精度损失。
3. D3 难学吗?
D3 有那么多好处,那么,D3 难学吗?
我了解到,有不少朋友认为 D3 挺难学的。
我总结了一下,D3 难学的原因有三:
(1)官方文档写得不好
官网上提供了 API 的资料,还有大量的例子。但是,每个例子怎么做的只有代码,没有文字说明。API 虽有说明,但是也却没有太多函数的使用例子。这就使用初入门的人感觉头大。
(2)不容易适应数据转换和绘制分开的模式
一个函数,drawPie(),输入数据,输出绘制图形,一般人的思维模式是这样的。但是,D3 偏偏将两者分开了,分开之后能带来极大的自由度,但是也使得它变得有些难学。
(3)外语不好
对大部分国人来说,看英文文档还是挺头疼的。由于我比较熟练地掌握了日语,刚开始是阅读的日文资料,因此入门较易。中文资料应该说还是比较匮乏的,不过近期已有所改善。毕竟是比较新的东西,慢慢资料会多起来的。
D3 乍看上去,有些难学,但是一旦掌握了,就能适应各种图表的制作,自由度极大,功能极强。有人说,D3 就像是 Photoshop,其他的库就像是美图秀秀,前者需要一定的时间学习,学成后在图像处理上所向披靡,后者不需要学习时间,会和不会没有太大的价值。这么比喻可能有点夸张,我有一个更好的比喻(灵感来源自辜鸿铭先生的文章)。
D3 就像是写毛笔字,其他的可视化库就像是写钢笔字。钢笔字上手容易,下笔简单,快捷,写出来的东西叫做文章。毛笔字需要长期磨练,上手较难,但是一旦掌握了,便能行云流水,心随念想,可进可退,只在笔尖,写出来的东西叫做艺术。
谢谢阅读。
文档信息
- 版权声明:署名(BY)-非商业性(NC)-禁止演绎(ND)
- 发表日期:2015 年 4 月 28 日
- 更多内容:OUR D3.JS - 数据可视化专题站 和 CSDN个人博客
- 备注:本文发表于 OUR D3.JS ,转载请注明出处,谢谢
【 随笔 】 D3 难吗?的更多相关文章
- 36岁IT老人再次随笔——程序员的门槛其实并不高,但却是一个易学难精的行当——IT的快车很快,我常看到不少人摔落下去,但又有不少身手敏捷的人跳了上来 good
36岁的我,还在IT里面留恋着技术.我不是什么技术牛人,只是不愿离开.搞硬件的朋友对我说:“我以为你是搞硬件的,没想到你软件方面这么厉害?”,搞软件的朋友对我说:“我以为你只是搞软件的,没想到你硬件方 ...
- css随笔1
1.简单清除浏览器样式 *{ padding: 0px; margin: 0px; } 2.得到屏幕范围的div html,body{ width: 1 ...
- Kooboo CMS 无聊随笔(2)
上次写了一篇博客 http://www.cnblogs.com/kmsfan/p/Kooboo_CMS_suibi.html 作为这个系列的开篇,简单的介绍了一下Kooboo CMS的一些基本情况和界 ...
- D3树状图异步按需加载数据
D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...
- 使用D3绘制图表(5)--水平柱状图表
绘制水平柱状图表的方法也不是很难,首先在svg中插入g,然后在g中插入rect. 1.html代码 <!DOCTYPE html> <html> <head> &l ...
- ASP.NET前端解决方案之一:Ext.Net入门随笔1
最近因为公司需要,进一步研发了Ext.Net技术,这里先做一个简明的介绍,给自己和大家记录一个初步的概念. 什么是Ext Ext就是ExtJS,引用下百度的解释:“ExtJS是一种主要用于创建前端用户 ...
- 【Android测试】【随笔】模拟双指点击
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5258660.html 手势 看到这个标题,很多人会想一想 ...
- D3.js 饼状图的制作
1.数据 有如下数据,需要可视化: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这样的值是不能直接绘图的.例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终 ...
- 随笔之Android平台上的进程调度探讨
http://blog.csdn.net/innost/article/details/6940136 随笔之Android平台上的进程调度探讨 一由来 最近在翻阅MediaProvider的时候,突 ...
随机推荐
- 【Python笔记】异常处理
1 什么是异常 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行.一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误. 当Pytho ...
- jsp日期控件My97DatePicker的使用
My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. 1.下载My97DatePicker组件包 2.将My97DatePicker包放在项目WebContent目录下 3.在页面 ...
- AJAX 基础知识
1.AJAX 是一种用于创建快速动态网页的技术.而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不 ...
- Matlab生成.dll文件在.NET中加载失败与平台的关系及解决方案
问题链接地址:http://bbs.elecfans.com/forum.php?mod=viewthread&tid=207995
- Kinetic使用注意点--ellipse
new Ellipse(config) 参数: config:包含所有配置项的对象. { radius: "半径,可以用数字a.数组[a,b]或对象{x:a,y:b}来表示" } ...
- OnDrawGizmos函数
如果你想绘制可被点选的gizmos,执行这个函数. 这允许你在场景中快速选择重要的物体. 注意: OnDrawGizmos使用相对鼠标坐标 using UnityEngine; using Syste ...
- linux 历史命令用法(转)
许多使用过Linux一段时间的人通过一些基础操作已经能够把Linux各方面基本玩转,但是如果没有经过系统学习的话就容易缺乏一些实战技巧.这系列文章介绍一些关于bash的能够提高效率的技巧,主要是关于历 ...
- C#中用ILMerge将所有引用的DLL打成一个DLL文件
有些文件是必须一起使用的,如果能把多个DLL打包成一个DLL文件,那么引用文件的时候就不需要一个个地去引用,而且每次移动文件的时候也不至于少了哪个必须的DLL文件. 多个DLL文件打包成一个DLL文件 ...
- 第三方登录过程—OAuth2.0协议
---恢复内容开始--- 理清思路 1.在第三方注册成为开发者,拿到第三方给的client_id(app_id---就像你的身份证.QQ号)和client_secret(就像你的QQ密码): 2.填写 ...
- encodeURIComponent()编码和decodeURIComponent()解码
html1: <!DOCTYPE HTML> <meta charset=utf-8> <meta http-equiv="X-UA-Compatible&qu ...