【D3.js 学习总结】16、D3布局-矩阵图

d3.layout.treemap()

矩阵图(Treemap)的API说明

  • treemap.children - 取得或设置孩子访问器。
  • treemap.links - 计算树节点中的父子链接。
  • treemap.mode - 改变布局的算法。
  • treemap.nodes - 计算矩形树布局并返回节点数组。
  • treemap.padding - 指定父子之间的间距。
  • treemap.round - 启用或者禁用四舍五入像素值。
  • treemap.size - 指定布局的尺寸。
  • treemap.sort - 控制兄弟节点的遍历顺序。
  • treemap.sticky - 让布局对稳定的更新是粘滞的(sticky)。
  • treemap.value - 取得或设置用来指定矩形树中矩形单元尺寸的值访问器。
  • treemap - treemap.nodes的别名。

1、数据

var dataset = {
  "name": "中国",
  "children":
      [
        {
          "name": "浙江",
          "children":
              [
                {"name":"杭州", "gdp":8343},
                {"name":"宁波", "gdp":7128},
                {"name":"温州", "gdp":4003},
                {"name":"绍兴", "gdp":3620},
                {"name":"湖州", "gdp":1803},
                {"name":"嘉兴", "gdp":3147},
                {"name":"金华", "gdp":2958},
                {"name":"衢州", "gdp":1056},
                {"name":"舟山", "gdp":1021},
                {"name":"台州", "gdp":3153},
                {"name":"丽水", "gdp":983}
              ]
        },
        {
          "name": "广东",
          "children":
              [
                {"name":"杭州", "gdp":8343},
                {"name":"宁波", "gdp":7128},
                {"name":"温州", "gdp":4003},
                {"name":"绍兴", "gdp":3620},
                {"name":"湖州", "gdp":1803},
                {"name":"嘉兴", "gdp":3147},
                {"name":"金华", "gdp":2958},
                {"name":"衢州", "gdp":1056},
                {"name":"舟山", "gdp":1021},
                {"name":"台州", "gdp":3153},
                {"name":"丽水", "gdp":983}
              ]
        },
        {
          "name": "福建",
          "children":
              [
                {"name":"杭州", "gdp":8343},
                {"name":"宁波", "gdp":7128},
                {"name":"温州", "gdp":4003},
                {"name":"绍兴", "gdp":3620},
                {"name":"湖州", "gdp":1803},
                {"name":"嘉兴", "gdp":3147},
                {"name":"金华", "gdp":2958},
                {"name":"衢州", "gdp":1056},
                {"name":"舟山", "gdp":1021},
                {"name":"台州", "gdp":3153},
                {"name":"丽水", "gdp":983}
              ]
        }
      ]
}

矩阵布局用的还是标准的层级关系数据结构,name、children字段为必须,数据值字段可自定或用默认的value,本例中用的是gdp,所以在接下来的数据转换中需要用value方法指定数据值字段。

2、数据转换

var width = 800;
var height = 500;
var treemap = d3.layout.treemap()
    .size([width, height])
    .value(function(d) {
        return d.gdp;
    });
var nodes = treemap.nodes(dataset);
var links = treemap.links(nodes);

转换数据后,节点数组的输出结果如图所示。

其中,节点对象的属性包括:

parent:父节点
children:子节点
depth:节点的深度
value:节点的value值,由value访问器决定
x:节点的x坐标
y:节点的y坐标
dx:x方向的宽度
dy:y方向的宽度

本例中将不会用到liks数据对象;

3、绘制图形

生成SVG容器

var svg = d3.select('body').append('svg')
    .attr('width',width)
    .attr('height',height)

生成颜色比例尺

var color = d3.scale.category10();

为每种类型数据创建容器

var groups = svg.selectAll("g")
    .data(nodes.filter(function(d) {
        return !d.children;
    }))
    .enter()
    .append("g");

为每种类型数据创建矩形图

var rects = groups.append("rect")
    .attr("class", "nodeRect")
    .attr("x", function(d) {
        return d.x;
    })
    .attr("y", function(d) {
        return d.y;
    })
    .attr("width", function(d) {
        return d.dx;
    })
    .attr("height", function(d) {
        return d.dy;
    })
    .style("fill", function(d, i) {
        return color(d.parent.name);
    });

生成文本

var texts = groups.append("text")
    .attr("class", "nodeName")
    .attr("x", function(d) {
        return d.x;
    })
    .attr("y", function(d) {
        return d.y;
    })
    .attr("dx", "0.5em")
    .attr("dy", "1.5em")
    .text(function(d) {
        return d.name + " " + d.gdp;
    });

查看在线演示

时间: 2024-08-17 15:46:04

【D3.js 学习总结】16、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 学习总结】11、D3布局-弦图

d3.layout.chord() 弦图是一种用于描述节点之间联系的图表. 弦图(Chord)的API说明 chord.chords - 取回计算的弦角度. chord.groups - 取回计算的分组角度. chord.matrix - 取得或设置布局需要的矩阵数据. chord.padding - 取得或设置弦片段间的角填充. chord.sortChords - 取得或设置用于弦的比较器(Z轴顺序). chord.sortGroups - 取得或设置用于分组的比较器. chord.sort

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

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

【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 - 指定布局尺寸.