echarts d3比较_技术人员眼中的BI之可视化 —— 艺术家:D3

可视化的经典著作

如上一篇聊ECharts时所说,用ECharts只回答了HOW的问题,并没有回答WHY的问题。要回答WHY的问题,我们就需要有理论来指引了。

可视化的一本经典之作就是:《The Grammar of Graphics》(《图形语法》)这本书了:

f5f5d481e658e024afe3e60e7203fe3c.png

此书作为经典,指引了很多图形库的设计。当然对于值得我们尊敬的经典著作,我肯定不期望能在一篇公众号的文章里就能描述清楚,还请有志于深入研究可视化的朋友们自行研读。

本文主要是从更实用的角度,用另一个非常著名的 D3 可视化JavaScript库来让大家体验一下可视化的魅力。

D3

D3,全名是:Data-Driven Documents,项目地址在:https://d3js.org/

7ed8025355babe13034fc7ea7ee1f830.png

项目的历史我就不再赘述了,大家可以自行搜索 D3 (也可以顺便了解一下它的创建者 Mike Bostock https://bost.ocks.org/mike/)

D3的特点:

  • 表达能力非常强大
  • 非常底层(如果类比编程语言的话, D3可以算是C语言,SVG是汇编语言)

由于其太底层又博大精深,所以比较难在文章中写清。所以,我也犹豫了很久要不要写D3,不过考虑到D3在可视化领域的“泰山北斗”地位,如果写可视化而不写D3,那将会是不完整的。So, 让我们开始D3之旅。

Step 0. 准备工作

本文中的例子是和前文ECharts中同样的例子:”世界人口总量“在2011年和2012年的对比。方便大家来体会EChart和D3的不同。

建立一个 d3.html 文件,内容如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>D3 Demo</title>
  6. <script src="https://d3js.org/d3.v5.js"></script>
  7. </head>
  8. <body>
  9. <svg></svg>
  10. </body>
  11. <script>
  12. </script>
  13. </html>

后续的所有D3代码将动态修改 <svg></svg> 中的内容

Step 1. 获取数据

首先,我们把数据(前文ECharts中的例子)存为csv文件,作为样例数据

yearcountrypopulation2011巴西182032012巴西193252011印尼234892012印尼234382011美国290342012美国310002011印度1049702012印度1215942011中国1317442012中国1341412011世界人口6302302012世界人口681807

接下来, 我们通过 d3.csv 函数来获取和解析CSV中的数据,以供后续使用。

由于CSV中,默认每个值都是文本类型,而我们知道 year 和 population 是数值类型,那么我们可以在 d3.csv 的第二个参数(回调函数)中做类型转化:

  1. let dataset = await(d3.csv("d3data.csv", function(d) {
  2. return {
  3. year: +d.year,
  4. country: d.country,
  5. population: +d.population
  6. };
  7. }));

获取到如下方便 D3 操作的数据:

  1. [
  2. {"year": 2011, "country": "巴西", "population": 18203},
  3. {"year": 2012, "country": "巴西", "population": 19325},
  4. {"year": 2011, "country": "印尼", "population": 23489},
  5. {"year": 2012, "country": "印尼", "population": 23438},
  6. {"year": 2011, "country": "美国", "population": 29034},
  7. {"year": 2012, "country": "美国", "population": 31000},
  8. {"year": 2011, "country": "印度", "population": 104970},
  9. {"year": 2012, "country": "印度", "population": 121594},
  10. {"year": 2011, "country": "中国", "population": 131744},
  11. {"year": 2012, "country": "中国", "population": 134141},
  12. {"year": 2011, "country": "世界人口", "population": 630230},
  13. {"year": 2012, "country": "世界人口", "population": 681807}
  14. ]

Step 2. 数据转化

《图形语法》一书中提到了三种数据转化操作:

  • cross:有点类似SQL中的笛卡尔积
  • blend:有点类似SQL中的Union
  • nest:有点类似SQL中的Group By,但是不一样

本例中,由于本例中数据是单表,我们只需要用 nest 操作,D3中的相关文档:https://github.com/d3/d3-collection/blob/v1.0.7/README.md#nest

我们先来看一下简单的对国家做 nest 操作会得到什么结果?

  1. d3.nest()
  2. .key(d => d.country)
  3. .entries(dataset)

得到结果:

  1. [
  2. {
  3. "key": "巴西",
  4. "values": [
  5. {"year": 2011, "country": "巴西", "population": 18203},
  6. {"year": 2012, "country": "巴西", "population": 19325}
  7. ]
  8. },
  9. {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值