【 D3.js 进阶系列 — 3.1 】 圆形分区图

分区图布局的 size 函数很有意思,即可用于制作矩形分区图,也可用于制作圆形分区图。本文就来谈讨一下圆形分区图的制作。

本文与【进阶 - 第 3.0 章】基本相同,只有布局函数的 size 函数和绘制图形的部分稍有区别。

1. 数据

本文仍然使用【入门 - 第 9.4 章】的数据,内容为中国境内几个城市的所属关系。

2. 布局(数据转换)

var partition = d3.layout.partition()
				.sort(null)
				.size([2 * Math.PI, radius * radius])
				.value(function(d) { return 1; });

第 3 行:size 函数,第一个值为 2 * PI ,第二个值为圆半径的平方。如果您只需要得到效果,可不比深究为什么这么做,只需记得这么用即可。

注意第3行与【进阶 - 第 3.0 章】的不同。

3. 绘制

先定义一个绘制弧形的函数,这个函数在【入门 - 第 9.1 章】中也用过。

var arc = d3.svg.arc()
			.startAngle(function(d) { return d.x; })
			.endAngle(function(d) { return d.x + d.dx; })
			.innerRadius(function(d) { return Math.sqrt(d.y); })
			.outerRadius(function(d) { return Math.sqrt(d.y + d.dy); });

请好好体会上面的代码是什么意思。如果以圆形的形式来转换数据,那么 d.x 和 d.y 分别代表圆弧的绕圆心方向的起始位置和由圆心向外方向的其实位置。d.dx 和 d.dy 分别代表各自的宽度。

接下来分别绘制圆弧和文字。

	var arcs = svg.selectAll("g")
				  .data(nodes)
				  .enter().append("g");

	arcs.append("path")
		.attr("display", function(d) { return d.depth ? null : "none"; }) // hide inner ring
		.attr("d", arc)
		.style("stroke", "#fff")
		.style("fill", function(d) { return color((d.children ? d : d.parent).name); })
		.on("mouseover",function(d){
			d3.select(this)
				.style("fill","yellow");
		})
		.on("mouseout",function(d){
			d3.select(this)
				.transition()
				.duration(200)
				.style("fill", function(d) {
					return color((d.children ? d : d.parent).name);
				});
		});

	arcs.append("text")
		.style("font-size", "12px")
		.style("font-family", "simsun")
		.attr("text-anchor","middle")
		.attr("transform",function(d,i){
				//第一个元素(最中间的),只平移不旋转
				if( i == 0 )
					return "translate(" + arc.centroid(d) + ")";

				//其他的元素,既平移也旋转
				var r = 0;
				if( (d.x+d.dx/2)/Math.PI*180 < 180 )  // 0 - 180 度以内的
					r = 180 * ((d.x + d.dx / 2 - Math.PI / 2) / Math.PI);
				else  // 180 - 360 度以内的
					r = 180 * ((d.x + d.dx / 2 + Math.PI / 2) / Math.PI);

				//既平移也旋转
				return  "translate(" + arc.centroid(d) + ")" +
						"rotate(" + r + ")";
		})
		.text(function(d) { return d.name; });

绘制方法问题不大,唯一要注意的是文字的旋转角度问题,请好好看看上面的注释问题。

4. 结果

完整代码,请点击下面的链接,再右键点击查看源代码:

http://www.ourd3js.com/demo/J-3.1/circle_partition.html

文档信息

时间: 2024-10-10 13:04:13

【 D3.js 进阶系列 — 3.1 】 圆形分区图的相关文章

【 D3.js 进阶系列 — 3.0 】 分区图

分区图( Partition ),也是 D3 的一个布局( Layout ).这个布局很有意思,可以做成方形也可能做成圆形,本文先介绍方形分区图的制作方法,这也是分区图最基本的形式. 分区图也是用于表示包含与被包含关系的. 1. 数据 本文使用[入门 - 第 9.4 章]的数据,内容为中国境内几个城市的所属关系. 2. 布局(数据转换) var partition = d3.layout.partition() .sort(null) .size([width,height]) .value(f

【 D3.js 进阶系列 — 3.2 】 分区图的函数

分区图的布局比较简单,本章介绍一下分区图的参数. 分区图布局为: d3.layout.partition() 其函数有6个. nodes() 将根数据传入后,得到的节点的数组,每个节点添加8个参数: parent - 父节点 children - 子节点 value - 表示节点的大小,由下面 value() 函数指定的值,父节点的值等于子节点值的和 depth - 节点的深度 x - 节点的x方向的坐标(不一定指x轴方向,跟据 size() 函数的意义而定) y - 节点的y方向的坐标(同上)

【 D3.js 进阶系列 — 2.1 】 力学图的事件 + 顶点的固定

本章讨论在力学图中经常使用到的事件( Event ),然后对[p=555">进阶 - 第 2.0 章]的人物关系图进行改进.使用户可以固定拖拽的对象. 在[入门 - 第 9.2 章]和[进阶 - 第 2.0 章]中,都用到了下面代码: force.on("tick", function(){ }); 这里的 force 是之前代码中定义的布局( Layout ).tick 表示当运动进行中每更新一帧时. 这是力学图中最常使用的事件,用于设定力学图每一帧是怎样更新的.除此

【 D3.js 进阶系列 — 2.2 】 力学图的参数

力学图的布局中有很多参数,本文将逐个说明. D3 中的力学图布局是使用韦尔莱积分法计算的,这是一种用于求解牛顿运动方程的数值方法,被广泛应用于分子动力学模拟以及视频游戏中.定义布局的代码如下: var force = d3.layout.force() 即可,D3 中提供了 17 个函数用于设定其参数和事件,在所有布局中是最多的,下面将对其进行说明. size() 用于设定力学图的作用范围,使用方法为 force.size( [ x , y ] ),这个函数用于指定两件事: 重力的重心位置为 (

【 D3.js 进阶系列 】 进阶总结

进阶系列的文章从去年10月开始写的,晃眼又是4个多月了,想在年前总结一下. 首先恭祝大家新年快乐.今年是羊年吧.前段时间和朋友聊天,聊到十二生肖里为什么没猫,我张口就道:不是因为十二生肖开会的时候猫迟到了吗? 呵呵,不知道这是谁给我灌输的观点.o(>﹏<)o 进阶系列的文章分为两部分,文章前括号里写有: [D3.js 进阶系列] [D3.js 选择集与数据详解] 虽然称之为"进阶",但并不是说一定要看完"入门"才能看.由于本人能力有限,不能很好地整理成由

【 D3.js 进阶系列 — 1.1 】 其他表格文件的读取

CSV 表格文件是以逗号作为单元分隔符的,其他还有以制表符 Tab 作为单元分隔符的 TSV 文件,还有人为定义的其它分隔符的表格文件.本文将说明在 D3 中如何读取它们. 1. TSV 表格文件是什么 TSV(Tab Separated Values),制表分隔值,它和 CSV 文件仅仅是分隔符不一致.它的格式如下: name age 张三 22 李四 24 2. D3 中读取 TSV 文件 在 D3 中读取 TSV 文件的方法和 CSV 文件是一样的,只要更改一下函数名即可.方法如下: d3

【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取

在入门系列的教程中,我们常用 d3.json() 函数来读取 json 格式的文件.json 格式很强大,但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 OpenOffice Calc 等生成的表格文件,因为简单易懂,容易编辑.                       Microsoft Excel 通常会保存为 xls 格式, OpenOffice Calc 通常会保存为 ods 格式.这些格式作为表格文件来说都很强大,但要读取它们是有些麻烦的,D3

【 D3.js 进阶系列 — 1.2 】 读取 CSV 文件时乱码的解决方法

在 D3 中使用 d3.csv 读取 CSV 文件时,有时会出现乱码问题.怎么解决呢? 1. 乱码问题 使用 d3.csv 读取 xxx.csv 文件时,如果 xxx.csv 文件使用的是 UTF-8 编码,不会有什么问题.当然,个人认为尽量使用 UTF-8 编码,可以在同一编码内使用各国文字. 但是,如果 xxx.csv 文件使用的是 utf-8 编码,使用 Microsoft Excel 打开的时候,可能会出现乱码,因为国内的 Excel 默认使用 GB2312 打开,而且在打开的时候不能选

【 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.3 】 弦图的制作

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