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

简介: # d3.layout.treemap() ![](https://img.alicdn.com/tps/TB1y7ZDKVXXXXXDXpXXXXXXXXXX-500-313.png) #### 矩阵图(Treemap)的API说明 * treemap.children - 取得或设置孩子访问器。 * treemap.links - 计算树节点中的父子链接。 * treem

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;
    });

查看在线演示

目录
相关文章
|
23天前
Next.js 实战 (二):搭建 Layouts 基础排版布局
本文介绍了作者在Next.js v15.x版本发布后,对一个旧项目的重构过程。文章详细说明了项目开发规范配置、UI组件库选择(最终选择了Ant-Design)、以及使用Ant Design的Layout组件实现中后台布局的方法。文末展示了布局的初步效果,并提供了GitHub仓库链接供读者参考学习。
Next.js 实战 (二):搭建 Layouts 基础排版布局
|
1月前
|
Web App开发 JavaScript 前端开发
如何学习JavaScript?
如何学习JavaScript?
48 5
|
1月前
|
JavaScript 前端开发 索引
JavaScript学习第二章--字符串
本文介绍了JavaScript中的字符串处理,包括普通字符串和模板字符串的使用方法及常见字符串操作方法如`charAt`、`concat`、`endsWith`等,适合前端学习者参考。作者是一位热爱前端技术的大一学生,专注于分享实用的编程技巧。
30 2
|
1月前
|
存储 JavaScript 前端开发
JavaScript学习第一章
本文档介绍了JavaScript的基础知识,包括其在网页中的作用、如何通过JavaScript动态设置HTML元素的CSS属性,以及JavaScript中的变量类型(`var`、`let`、`const`)和数据类型(基本数据类型与引用数据类型)。通过实例代码详细解释了JavaScript的核心概念,适合初学者入门学习。
54 1
|
2月前
|
JavaScript
js学习--商品列表商品详情
js学习--商品列表商品详情
31 2
|
2月前
|
JavaScript
js学习--九宫格抽奖
js学习--九宫格抽奖
23 2
|
2月前
|
JavaScript
js学习--开屏弹窗
js学习--开屏弹窗
46 1
|
2月前
|
JavaScript
js学习--抽奖
js学习--抽奖
24 1
|
2月前
|
JavaScript 前端开发 容器
js之弹性布局使用方法
js之弹性布局使用方法
39 0
|
2月前
|
JavaScript 前端开发 容器
js之dom学习
js之dom学习
48 0