【 D3.js 入门系列 --- 9.3 】 弦图生产

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

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

转载请注明出处,谢谢。



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

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

线的粗细表示权重:

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

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

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

1. 首先给出数据

		var city_name = [ "北京" , "上海" , "广州" , "深圳" , "香港"  ];

		var population = [
		  [ 1000,  3045  , 4567 , 1234 , 3714 ],
		  [ 3214,  2000  , 2060 , 124  , 3234 ],
		  [ 8761,  6545  , 3000 , 8045 , 647  ],
		  [ 3211,  1067  , 3214 , 4000  , 1006 ],
		  [ 2146,  1034  , 6745 , 4764  , 5000 ]
		];

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

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

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

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

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

好了!!!

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

2. 转换数据

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

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

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

groups:

chords:

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

var width  = 600;
		var height = 600;
		var innerRadius = width/2 * 0.7;
		var outerRadius = innerRadius * 1.1;

		var color20 = d3.scale.category20();

		var svg = d3.select("body").append("svg")
			.attr("width", width)
			.attr("height", height)
		    .append("g")
			.attr("transform", "translate(" + width/2 + "," + height/2 + ")");

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

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

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

var outer_arc =  d3.svg.arc()
					 .innerRadius(innerRadius)
					 .outerRadius(outerRadius);

		var g_outer = svg.append("g");

		g_outer.selectAll("path")
				.data(chord_layout.groups)
				.enter()
				.append("path")
				.style("fill", function(d) { return color20(d.index); })
				.style("stroke", function(d) { return color20(d.index); })
				.attr("d", outer_arc );

		g_outer.selectAll("text")
				.data(chord_layout.groups)
				.enter()
				.append("text")
				.each( function(d,i) {
					d.angle = (d.startAngle + d.endAngle) / 2;
					d.name = city_name[i];
				})
				.attr("dy",".35em")
				.attr("transform", function(d){
					return "rotate(" + ( d.angle * 180 / Math.PI ) + ")" +
						   "translate(0,"+ -1.0*(outerRadius+10) +")" +
						    ( ( d.angle > Math.PI*3/4 && d.angle < Math.PI*5/4 ) ? "rotate(180)" : "");
				})
				.text(function(d){
					return d.name;
				});

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

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

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

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

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

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

5. 内部弦的绘制

var inner_chord =  d3.svg.chord()
						.radius(innerRadius);

		svg.append("g")
			.attr("class", "chord")
		    .selectAll("path")
			.data(chord_layout.chords)
		    .enter()
			.append("path")
			.attr("d", inner_chord )
		    .style("fill", function(d) { return color20(d.source.index); })
			.style("opacity", 1)
			.on("mouseover",function(d,i){
				d3.select(this)
					.style("fill","yellow");
			})
			.on("mouseout",function(d,i) {
				d3.select(this)
					.transition()
                    .duration(1000)
					.style("fill",color20(d.source.index));
			});

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

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

结果例如以下图:

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

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

谢谢阅阅读。

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

时间: 2024-10-05 06:37:09

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

【 D3.js 入门系列 --- 9.3 】 弦图的制作

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 弦图( Chord ),主要用于表示两个节点之间的联系.如下图: 两点之间的连线表示,谁和谁具有联系: 线的粗细表示权重: 上面的介绍源于: http://circos.ca/guide/tables/  ,我就不详细介绍了,还是很好理解的. 那么在 D3 中怎么用 layout 转换出弦图所需要的数据,并作图呢?请耐心往下看. 1. 首先给出数据 var ci

【 D3.js 入门系列 --- 9.6 】 打包图的制作

本人的个人博客为:www.ourd3js.com csdn博客为:blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 打包图( Pack ),用于包含与被包含的关系,也表示各个对象的权重,通常用一圆套一圆来表示前者,用圆的大小来表示后者. 先看本节所使用的数据:  city2.json 这是各城市所属关系的数据.我们现在要用 D3 的 layout 来转换数据,使其容易进行可视化处理. var pack = d3.layout.pack() .size([ width, heigh

【 D3.js 入门系列 --- 9.5 】 树状图的制作

这一节学习树状图的制作.树状图的制作和集群图完全相同,经过这两种 layout 转换后的数据也很相似. 本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 树状图( Tree )通常用于表示层级.上下级.包含与被包含关系.树状图的制作和 9.4节集群图的制作 的代码几乎完全一样.不错,你没看错,几乎完全一样.那么为什么要把这两种图分开,它们有什么不同呢?先来看看对于同一组数据,它们的结果有什么不同.数据为: {

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

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. Layout ,直译为"布局,安排".但在 D3 中不是这个意思. D3 中有很多 Layout 函数,它们不是为了在画面中布局什么,在 D3 中是对输入的数据进行转换,转换成比较容易进行可视化的数据.实际进行可视化时,需要其他的代码.我们可以简单地把 Layout 理解为"制作常见图形的函数",比如饼状图等等. D3 中一共提供了

【 D3.js 入门系列 --- 7 】 理解 update, enter, exit 的使用

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 在前面几节中反复出现了如下代码: svg.selectAll("rect") .data(dataset) .enter() .append("rect") 当所选择的 rect 数量比绑定的数据 dataset 的数量少的时候,通常会用到以上代码,这一节就详细说说当被选择元素和数据数量不一致时该如何处理. 这一节将涉及到三个函数.

【 D3.js 入门系列 --- 10 】 地图的绘制

本人的个人博客为:www.ourd3js.com csdn博客为:blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 地图的制作在 D3 中可以说是最重要的一环.因为在进行数据可视化时,很多情况都会和地图联系在一起,如中国各省的人口多少,GDP多少等,都可以和地图联系在一起. D3 中制作地图所需要的文件问 JSON 文件.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.关于 JSON 的语法格式,可以在: http://www.w3s

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

[ D3.js 入门系列 — 0 ] 简介和安装 发表于2014/06/12 近年来,可视化越来越流行,许多报刊杂志.门户网站.新闻.媒体都大量使用可视化技术,使得复杂的数据和文字变得十分容易理解,有一句谚语“一张图片价值于一千个字”,的确是名副其实.各种数据可视化工具也如井喷式地发展,D3 正是其中的佼佼者. 1. D3 是什么 D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档.听名字有点抽象,说简单一点,其实就是一个 JavaScript

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

D3 新专题首页 一转眼,这个入门系列已经积累了二十二篇文章之多,我想作为 D3.js 这款数据可视化工具的入门来说已经足够了.相信仅仅要看完本系列.以后全然能够在辅以查询的情况下完毕大部分可视化工作. D3.js 最早的 v1.0 版本号是由 Michael Bostock 于2011年2月18日公布,其后经过多人的不断完好,眼下最新的版本号为 v3.4.11.从公布至今三年多的时间里,D3.js 在国外不断有人尝试并制作教程.成为了流行的数据可视化工具.可是眼下在国内能查询到中文资料还比較少

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

家是我的个人博客: http://www.ourd3js.com/  ,csdn博客首页为:http://blog.csdn.net/lzhlzz/.转载请注明出处,谢谢. D3的全称是(Data-Driven Documents),顾名思义能够知道是一个关于数据驱动的文档的javascript类库.假设你不知道什么是javascript.请先学习javascript的相关知识. 说得简单一点,D3.js主要是用于操作数据的,它通过使用HTML.SVG.CSS来给你的数据注入生命,即转换为各种简