我个人的博客: www.ourd3js.com

csdn博客为: blog.csdn.net/lzhlzz

转载请注明出处,谢谢。


弦图( Chord ),主要用于表示两个节点之间的联系。例如以下图:

两点之间的连线表示。谁和谁具有联系:

线的粗细表示权重:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHpobHp6/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

上面的介绍源于: http://circos.ca/guide/tables/  ,我就不具体介绍了,还是非常好理解的。

那么在 D3 中怎么用 layout 转换出弦图所须要的数据。并作图呢?请耐心往下看。

1. 首先给出数据

  1. var city_name = [ "北京" , "上海" , "广州" , "深圳" , "香港" ];
  2.  
  3. var population = [
  4. [ 1000, 3045  , 4567 , 1234 , 3714 ],
  5. [ 3214, 2000  , 2060 , 124 , 3234 ],
  6. [ 8761, 6545  , 3000 , 8045 , 647 ],
  7. [ 3211, 1067 , 3214 , 4000 , 1006 ],
  8. [ 2146, 1034  , 6745 , 4764 , 5000 ]
  9. ];

我们的数据是一些城市名和一大堆数字,这些数字表示城市人口的来源。如

  北京 上海
北京 1000 3045
上海 3214 2000

左边第一列是被统计人口的城市,上边第一行是被统计的来源城市,即:

北京市的人口有1000个人来自本地,有3045人是来自上海的移民,总人口为 1000 + 3045。

    上海市的人口有2000个人来自本地。有3214人是来自北京的移民,总人口为 3214 + 2000。

好了!!!

对于这样一组数据。怎么进行可视化。

2. 转换数据

  1. var chord_layout = d3.layout.chord()
  2. .padding(0.03)
  3. .sortSubgroups(d3.descending)
  4. .matrix(population);

能够用 console.log 输出一下转换后的数据。

转换后,population 实际分成了两个部分,groups 和 chords 。groups 就是上面图片中的节点。 chords 就是上面图片中的连线。chords 里面分为 source 和 target ,也就是连线的两端。下图为转换后的结果图:

groups:

chords:

3. SVG,弦图。颜色函数的定义

  1. var width = 600;
  2. var height = 600;
  3. var innerRadius = width/2 * 0.7;
  4. var outerRadius = innerRadius * 1.1;
  5.  
  6. var color20 = d3.scale.category20();
  7.  
  8. var svg = d3.select("body").append("svg")
  9. .attr("width", width)
  10. .attr("height", height)
  11. .append("g")
  12. .attr("transform", "translate(" + width/2 + "," + height/2 + ")");

这里大家都非常熟悉了,就不用解释了。

假设看不懂,请看前面章节。

4. 绘制外部弦(即分组。有多少个城市画多少个弦),及绘制城市名称

  1. var outer_arc = d3.svg.arc()
  2. .innerRadius(innerRadius)
  3. .outerRadius(outerRadius);
  4.  
  5. var g_outer = svg.append("g");
  6.  
  7. g_outer.selectAll("path")
  8. .data(chord_layout.groups)
  9. .enter()
  10. .append("path")
  11. .style("fill", function(d) { return color20(d.index); })
  12. .style("stroke", function(d) { return color20(d.index); })
  13. .attr("d", outer_arc );
  14.  
  15. g_outer.selectAll("text")
  16. .data(chord_layout.groups)
  17. .enter()
  18. .append("text")
  19. .each( function(d,i) {
  20. d.angle = (d.startAngle + d.endAngle) / 2;
  21. d.name = city_name[i];
  22. })
  23. .attr("dy",".35em")
  24. .attr("transform", function(d){
  25. return "rotate(" + ( d.angle * 180 / Math.PI ) + ")" +
  26. "translate(0,"+ -1.0*(outerRadius+10) +")" +
  27. ( ( d.angle > Math.PI*3/4 && d.angle < Math.PI*5/4 ) ? "rotate(180)" : "");
  28. })
  29. .text(function(d){
  30. return d.name;
  31. });

绘制外部弦的部分,事实上和绘制一个饼状图是一样的。能够參照9.1节。那么上面的代码不难理解。还有就是绘制弦外面的文字(即城市名称),请看最后一段代码:

绑定数据后,有一个 each() 。这个函数是表示对于不论什么一个绑定的元素,都运行后面的无名函数 function 的代码,这里的代码为: 计算一个角度,赋值给 d.angle 。获取城市的名称。

在用 transform 进行位移时,要注意转换的顺序: rotate -> translate。 还有就是转换的最后一行代码:

  1. ( ( d.angle > Math.PI*3/4 && d.angle < Math.PI*5/4 ) ? "rotate(180)" : "")

这是表示,当角度在135°到225°之间时,旋转180°。

否则下方的文字是倒的,不利于观看。

5. 内部弦的绘制

  1. var inner_chord = d3.svg.chord()
  2. .radius(innerRadius);
  3.  
  4. svg.append("g")
  5. .attr("class", "chord")
  6. .selectAll("path")
  7. .data(chord_layout.chords)
  8. .enter()
  9. .append("path")
  10. .attr("d", inner_chord )
  11. .style("fill", function(d) { return color20(d.source.index); })
  12. .style("opacity", 1)
  13. .on("mouseover",function(d,i){
  14. d3.select(this)
  15. .style("fill","yellow");
  16. })
  17. .on("mouseout",function(d,i) {
  18. d3.select(this)
  19. .transition()
  20. .duration(1000)
  21. .style("fill",color20(d.source.index));
  22. });

绘制内部弦有专用的函数 d3.svg.chord() ,仅仅要将转换后的參数传给此函数。就可以做出内部弦。哈哈,方便吧。

以下还有几句关于鼠标操作的代码: mouseover , mouseout 。 可參看第8节。

结果例如以下图:

对话操作的内容,请点击以下网址,把鼠标放在弦图上看看吧。

http://www.ourd3js.com/demo/chord.html

谢谢阅阅读。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

【 D3.js 入门系列 --- 9.3 】 弦图生产的更多相关文章

  1. 【 D3.js 入门系列 — 11 】 入门总结

    D3 新专题首页 一转眼,这个入门系列已经积累了二十二篇文章之多,我想作为 D3.js 这款数据可视化工具的入门来说已经足够了.相信仅仅要看完本系列.以后全然能够在辅以查询的情况下完毕大部分可视化工作 ...

  2. 【 D3.js 入门系列 — 1 】 第一个程序 HelloWorld

    记得以前刚上大一学 C 语言的时候,写的第一个程序就是在控制台上输出 HelloWorld .当时很纳闷,为什么要输出这个.老师解释说所有学编程入门的第一个程序都是在屏幕上输出 HelloWorld, ...

  3. 【 D3.js 入门系列 --- 9 】 常见可视化图形

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. Layout ,直译为"布局,安排".但在 ...

  4. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  5. 【 D3.js 入门系列 --- 2.1 】 关于如何选择,插入,删除元素

    在D3.js中,选择元素的函数有两个:select 和 selectAll . 先说明一下它们的区别: select 是选择所有指定元素的第一个 selectAll 是选择指定元素的全部(以用于后面同 ...

  6. 【 D3.js 入门系列 --- 2 】 如何使用数据和选择元素

    接着上一讲的内容,这次讨论如何选择元素和使用数据.    现在页面中有三行文字,代码为: <p>Hello World 1</p> <p>Hello World 2 ...

  7. 【 D3.js 入门系列 --- 1 】 第一个程序HelloWorld

    下面开始用D3.js处理第一个简单问题,先看下面的代码: <html> <head> <meta charset="utf-8"> <ti ...

  8. 【 D3.js 入门系列 --- 0 】 简介和安装

    D3的全称是(Data-Driven Documents),顾名思义可以知道是一个关于数据驱动的文档的javascript类库.如果你不知道什么是javascript,请先学习javascript的相 ...

  9. 【 D3.js 入门系列 --- 2 】 怎样使用数据和选择元素

    本人的个人博客首页为: http://www.ourd3js.com/  ,csdn博客首页为:http://blog.csdn.net/lzhlzz/. 转载请注明出处,谢谢. 接着上一讲的内容,这 ...

随机推荐

  1. complex query几个原则

    1.一般来说in比exists更有利(更容易变成join). 2.尽量避免union,使用union all代替,避免sort. 3,绝对不能在没有on条件下使用join(除非有特殊目的). 4.ou ...

  2. Oracle 11gR2 静默安装奇怪错误

    在静默安装Oracle 11gR2 的时候发现的奇怪错误,有点摸不着头脑 【步骤一】配置静默文件只安装软件 #--------------------------------------------- ...

  3. Android系统开发(1)——GCC编译器的编译和安装过程

    GCC编译器介绍 GCC编译器(GNG C Compiler)是GNU项目中符合ANSI C标准的编译系统,能够编译C  C++  Object C等语言编写的程序,同时GCC也是一个交叉编译器,特别 ...

  4. ios开发runtime学习三:动态添加方法(实际应用少,面试)

    #import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...

  5. ios开发runtime学习二:runtime交换方法

    #import "ViewController.h" /* Runtime(交换方法):主要想修改系统的方法实现 需求: 比如说有一个项目,已经开发了2年,忽然项目负责人添加一个功 ...

  6. WP8.1开发:后台任务详解(求推荐)

    小梦今天给大家分享一下windows phone 8.1中的后台任务如何实现,许多应用都会用到后台任务,所以我们必须得掌握. 新建后台任务类: 首先我们先新建一个windows phone 8.1空白 ...

  7. 【C++竞赛 C】yyy的数学公式

    时间限制:1s 内存限制:32MB 问题描述 yyy遇到了一个数学问题如下: S_n=∑F(i) 其中F(i)表示i的最大奇因数 yyy的数学非常好,很快就得到了结果.现在他把问题交给你,你能解决吗? ...

  8. 详解PHP设置定时任务的实现方法

    详解PHP设置定时任务的实现方法 一.总结 一句话总结: 1.ignore_user_abort(true)是什么意思? 无论客户端是否关闭浏览器,下面的代码都将得到执行 2.set_time_lim ...

  9. java获取访问路径、域名、项目名、请求入参

    废话不多说(这句不是废话吗>>),直接提出可以运行的类,你放到一个web项目访问下就知道了. //测试页面-跳转到输入数据的form表单 public String test1(){ Ac ...

  10. PatentTips - Systems, methods, and devices for dynamic resource monitoring and allocation in a cluster system

    BACKGROUND  1. Field  The embodiments of the disclosure generally relate to computer clusters, and m ...