【D3.js 学习总结】11、D3布局-弦图

d3.layout.chord()

弦图是一种用于描述节点之间联系的图表。

弦图(Chord)的API说明

  • chord.chords - 取回计算的弦角度。
  • chord.groups - 取回计算的分组角度。
  • chord.matrix - 取得或设置布局需要的矩阵数据。
  • chord.padding - 取得或设置弦片段间的角填充。
  • chord.sortChords - 取得或设置用于弦的比较器(Z轴顺序)。
  • chord.sortGroups - 取得或设置用于分组的比较器。
  • chord.sortSubgroups - 取得或设置用于子分组的比较器。

我们通过一个制作一个弦图来讲解弦布局。

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 4567 1234 3714
上海 3214 2000 2060 124 3234
广州 8761 6545 3000 8045 647
深圳 3211 1067 3214 4000 1006
香港 2146 1034 6745 4764 5000

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

2. 数据转换

var chord_layout = d3.layout.chord()
    .padding(0.03) //节点之间的间隔
    .matrix(population); //输入矩阵
var groups = chord_layout.groups();
var chords = chord_layout.chords();

population 经过转换后,实际上分成了两部分:groups 和 chords。前者是节点,后者是连线,也就是弦。

通过弦布局转换数据后,数据被转换成如下形式:

节点

连线

3. 绘制图形

绘制容器

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

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

定义颜色比例尺

var color20 = d3.scale.category20();

创建圆弧SVG生成器

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

绘制圆弧路径

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

g_outer.selectAll("path")
    .data(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(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;
    });

创建弦图SVG生成器

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

绘制弦图路径

svg.append("g")
    .attr("class", "chord")
    .selectAll("path")
    .data(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));
    });

查看在线演示

时间: 2024-08-30 19:59:56

【D3.js 学习总结】11、D3布局-弦图的相关文章

【D3.js 学习总结】8、D3布局介绍

布局是 D3 中一个十分重要的概念,可以理解成 "制作常见图形的函数",有了它制作各种相对复杂的图表就方便多了. D3 与其它很多可视化工具不同,相对来说较底层,对初学者来说不太方便,但是一旦掌握了,就比其他工具更加得心应手. 下图展示了 D3 与其它可视化工具的区别: 布局的作用是:将不适合用于绘图的数据转换成了适合用于绘图的数据. D3 总共提供了 12 个布局: 饼状图(Pie) 力导向图(Force) 弦图(Chord) 捆图(Bundle) 直方图(Histogram) 堆栈

【D3.js 学习总结】9、D3布局-饼状图

d3.layout.pie() 在第4章D3 创建SVG里我们讲过 圆弧图 的制作方法,我们需要准备这样的数据才能画出圆弧: var angle = 2*Math.PI; var data = [ { startAngle: 0, endAngle: 0.2*angle }, { startAngle: 0.5*angle, endAngle: 0.8*angle } ]; 如果都是自己去计算startAngle或endAngle,那太繁琐了,这时候就可以用到饼状布局来生成需要的数据. 千万记住

【D3.js 学习总结】4、D3 创建SVG

D3图表大都是由SVG来实现的,所以在继续学习前需要了解一些SVG的知识,可以通过看svg教程来学习一下. D3可以生成一般的SVG形状,它也内置了很多SVG图表,方便我们直接生成实用的图表. 我们先来创建一个SVG容器,其它SVG图形都需要在容器里来创建: var body = d3.select('body'); var svg = body.append('svg').attr('width',200).attr('height',200); 普通SVG 用D3来生成一般的SVG图形,可以

【D3.js 学习总结】1、初识D3

D3是指数据驱动文档(Data-Driven Documents),根据D3的官方定义: D3.js是一个JavaScript库,它可以通过数据来操作文档.D3可以通过使用HTML.SVG和CSS把数据鲜活形象地展现出来.D3严格遵循Web标准,因而可以让你的程序轻松兼容现代主流浏览器并避免对特定框架的依赖.同时,它提供了强大的可视化组件,可以让使用者以数据驱动的方式去操作DOM.----D3维基(2013年8月) 从一个Hello Wordld示例来看看d3如何运行 点击查看在线DEMO fu

【D3.js 学习总结】21、D3交互事件

前20节中,我们讲了各种静态D3图表的制作,好的图表应该是要与用户进行互动的,这节来讲讲D3的交互事件: d3.event selection选择器事件监听的写法跟平时我们用的jQuery类似,如: selection.on('click',function(d,i){ alert('ok'); }) 但请注意,点击事件触发的匿名函数参数不是我们常用的e或event,而是绑定在选择器上的数据d和数据的序列号i,这点非常重要. 注册事件 我们只要调用全局对象d3.event,它是DOM事件,并实现

【D3.js 学习总结】10、D3布局-力学图

d3.layout.force() 力学图(也称为导向图,也有叫网络拓补图的,反正就是通过排斥得到关系远近的结构)在社交网络研究.信息传播途径等群体关系研究中应用非常广泛,它可以直观地反映群体与群体之间联系的渠道.交集多少,群体内部成员的联系强度等. 力学(Force)的API说明 force.on - 监听布局位置的变化.(仅支持"start","step","end"三种事件) force.nodes - 获得或设置布局中的节点(node)阵

【D3.js 学习总结】14、D3布局-打包图

d3.layout.pack() 打包图用于表示包含与被包含的关系,也可表示各对象的权重,通常用一圆套一圆来表示前者,用圆的大小来表示后者. 打包图(Pack)的API说明 pack.children - 取得或设置子节点的访问器. pack.links - 计算树节点中的父子链接. pack.nodes - 计算包布局并返回节点数组. pack.padding - 指定布局间距(以像素为单位) pack.radius - 指定节点半径(不是由值派生来的) pack.size - 指定布局尺寸.

【D3.js 学习总结】17、D3布局-分区图(矩形)

d3.layout.partition() 分区图可以展示为方形或者圆形,从原理上来说它是树状结构的一种可视化展现形式,表示包含与被包含的关系: 分区图(Partition)的API说明 partition.children - 取得或设置孩子访问器. partition.links - 计算树节点中的父子链接. partition.nodes - 计算分区布局并返回节点数组. partition.size - 指定布局的尺寸. partition.sort - 控制兄弟节点的遍历顺序. par

【D3.js 学习总结】20、D3布局-捆图

d3.layout.bundle() 下图是航班查询网站全球航班雷达(FlightRadar24)显示的今日长三角地区的飞机飞行图: 图中我们能看到每时每刻有多少飞行在我们头上飞,有北京-杭州.杭州-日本.上海-北京的航班等等,如果你想知道哪个机场最繁忙,那就可以用到捆图来展现了: 捆图(Bundle)是D3布局中即简单又复杂的一种布局方式,说简单,它只有2个函数来实现数据转换,说复杂,它的实现需要结合其它层级布局来实现,如:集群图.打包图.分区图.树状图.矩阵树图.最常见的是与集群图一起使用,