D3.js绘制树形图

您所在的位置:网站首页 ppt做树状图教程 D3.js绘制树形图

D3.js绘制树形图

2023-10-17 01:31| 来源: 网络整理| 查看: 265

1、什么是D3:

         data-driven-document,翻译为数据驱动的文档,是一种由数据来决定绘图流程的程序设计模型。简单说,D3是一个JavaScript的函数库,用来做数据可视化(将数据的各种属性和变量以图形图表的形式呈现出来)。

2、D3的优点:

         前端可视化库:Hightcharts(付费)、Echarts、Chart等可以看做一类(是被封装好的库),使开发者很容易的就能制作图表(只需修改一下数据即可),但是能够给与开发者设计和控制的空间太少(个人可定制性不强,对官方平台的依赖性太强)。

         封装层次太高会导致定制型不强,封装层次太低,又会是程序代码冗长,而D3在封装层次上就做到了相对的平衡,特点如下:

              1.D3相对比较底层,代码却足够简洁。

              2.D3更像数学库,为绘图提供了支持。

              3.封装了很多操作,但又给予开发者足够控制图表的自由,提高图表的定制性。   

3、D3的学习方法:

         D3是一个JavaScript库,API开发多也很完善,demo实例也很多,所以只需要开发者,会查看API文档即可,不需要记住。 把d3.js 当成jQuery一样去学,就容易的多了。

4、D3的知识体系:

          1.选择集、数据绑定、Dom操作。

          2.比例尺和坐标轴。

          3.绘制(几种(类:同类)生成器):

                  3.1 线段(类:同类)生成器。

                  3.2 区域(类:同类)生成器。

                  3.3 弧生(类:同类)成器。

                  3.4 符号(类:同类)生成器。

                  3.5 弦生(类:同类)成器。

                  3.6 对角线(类:同类)生成器。

5、学习的D3的知识准备基础:

          提示:D3的3.X版本是都基于Svg的,4.X版本是同时基于Svg和Canvas的。svg和canvas都是用来画图的,只不过有矢量图和标量图(位图)的区分。

          1.Svg(可缩放矢量图形)

                   1.1  矩形(rect)

                   1.2 圆形(circle)

                   1.3 椭圆形(ellipse)

                   1.4 多边形(polygon)

                   1.5 线段(line)

                   1.6 折线(ployline)

                   1.7 路径(path)

                   1.8 文字(text)

          2.选择集和数据绑定:

                   我们把d3.select()和d3.selectAll() 返回的对象称为选择集。对象的添加、删除、修改的操作都需要使用选择集。选择集还是数据绑定的受体。

                   selection.data()  即 d3.select().data() 可以将 数组的各项 分别绑定在 选择集查找到的各个元素上。

                   提示:d3对象有点像jQuery里的$对象。

          3.数据绑定最重要的三个选择集:

                    update(需要更新的元素) :

                             含有数据的数组长度  等于  页面的DOM元素。这种情况下数组长度和元素数量相等。这种动作称为更新。

                             表达式:var uptate = d3.select(element).data(Array);

                    enter(需要添加的元素) :

                              含有数据的数组长度 大于 页面的DOM元素。   这种情况下页面的元素数据不够,需要添加的那一部分DOM元素称为enter()。

                              表达式:var enter = uptate.enter().append(element);

                   exit(需要删除的元素):

                             含有数据的数组长度  小于  页面的DOM元素。这种情况下元素数量多了,需要删掉的那一部分DOM元素称为exit()。

                             表达式:var exit = updata.exit().remove(element);

6、DOM操作:

              attr():元素属性操作。

              append(): 在被选元素的结尾(仍然在内部)插入指定内容。

              insert(): 把元素插入到容器指定的位置(按索引关系)。

7、加载数据:

              d3.json(url 地址 ,callback 回调函数)

              表达式:d3.json("data.json",function(error1,data1) {console.log(error1, data1)});

8.D3布局:

      捆绑布局。

      弦布局。

      树布局。

      矩阵树布局。

     力布局。

     包布局。

     分区布局。

     堆叠布局。

      直方图布局。

      饼布局。

       地图。

9、举例 树图入门(其它图与之类似):

          1.树图布局API:

                   d3.layout.tree():创建一个树图布局。

                   tree.size():设置树图的容器的宽高。

                    tree.separation([separation])设置相邻节点间隔。

                    tree.nodes(root)根据root计算获取节点数组。

                    tree.links(nodes)根据nodes计算获取连线数组。

                   总结:根据两点绘制一条线段的结论得出,links 个数总比nodes个数 少一个。

          2.节点(nodes)对象包含以下属性:

                        parent:父节点。

                        children:子节点。

                        depth:节点深度。

                        x:节点的x坐标。

                        y:节点的y坐标。

          3.节点间连线(links)对象,包含以下属性:

                        source:源节点(连线的前半段节点)。

                        target:目标节点(连线的后半段节点)。

 

 10、举例:树图实现步骤(其它图与之类似):

          1. 选中页面给页面添加svg标签;设置Svg绘制区域的宽和高;添加g元素(svg的group分组标签元素)并设置位置。

          2.生成树状布局,设置树图布局容器尺寸。

          3..对角线生成器,并旋转90度。

          4.请求数据:

              4.1获取nodes节点数组和links连线数组。               4.2生成连线。               4.3生成节点。               4.4给节点添加圆圈,设置半径。               4.5给节点添加文本,设置文本的样式位置。

 

11、树图代码实现demo:

效果图:

将数据和HTML代码复制到本地,可以直接运行。数据文件与HTML文件处于同级目录

//树图 json格式本地数据准备  treeData.json 

{ "name":"如何学习D3", "children": [     {        "name":"预备知识" ,          "children":         [                 {"name":"HTML & CSS" },                 {"name":"JavaScript" },                 {"name":"DOM" },                 {"name":"SVG" }         ]        },            {          "name":"安装" ,          "children":         [             {                 "name":"记事本软件",                 "children":                 [                     {"name":"Notepad++"},                     {"name":"EditPlus"},                     {"name":"Sublime Text"}                 ]             },             {                 "name":"服务器软件",                 "children":                 [                     {"name":"Apache Http Server"},                     {"name":"Tomcat"}                 ]             },             {"name":"下载D3.js"}         ]      },          {          "name":"入门",         "children":         [             {                 "name":"选择集",                 "children":                 [                     {"name":"select"},                     {"name":"selectAll"}                 ]             },             {                 "name":"绑定数据",                 "children":                 [                     {"name":"datum"},                     {"name":"data"}                 ]             },             {"name":"添加删除元素"},             {                 "name":"简单图形",                 "children":                 [                     {"name":"柱形图"},                     {"name":"折线图"},                     {"name":"散点图"}                 ]             },             {"name":"比例尺"},             {"name":"生成器"},             {"name":"过渡"}         ]      },          {          "name":"进阶" ,          "children":         [             {                 "name":"布局的应用",                 "children":                 [                     {"name":"饼状图"},                     {"name":"树状图"},                     {"name":"矩阵树图"}                 ]             },             {"name":"地图"}         ]     } ] }

 

 

                      d3-tree树图实现                      /* 圈圈节点样式 */            .node circle{                 fill: #fff;                 stroke: steelblue;                 stroke-width:1.5px;             }             /* 文字样式 */            .node text{                 font-size: 12px;             }             /* 连线的样式 */            .link{                 fill: none;                 stroke: #ccc;                 stroke-width: 1.5px;             }                                                          // 1、 选中页面给页面添加svg标签;设置Svg绘制区域的宽和高;添加g元素(svg的group分组标签元素)并设置位置。            var width = 500;             var height = 500;             var svg = d3.select('body')                     .append('svg')                     .attr('width',width)                     .attr('height',height)                         .append('g')                             .attr('transform','translate(50,0)')             // 2、生成树状布局,设置树图布局容器尺寸。            var tree = d3.layout.tree()                     .size([360, 320]);             // 3、对角线生成器,并旋转90度。            var diagonal  = d3.svg.diagonal()                     .projection(d=> [d.y,d.x]);  //横纵坐标对调(x,y) => (y,x)                     // 4、请求数据:                d3.json('treeData.json',function(error,root){                     // 4.1获取nodes节点数组和links连线数组。                    var nodes = tree.nodes(root);                     var links = tree.links(nodes);                     // 4.2生成连线。                    var link = svg.selectAll('.link')                             .data(links)                             .enter()                                 .append('path')                                 .attr('class','link')                                 .attr('d',diagonal)                         // 4.3生成节点。                    var node = svg.selectAll('.node')                             .data(nodes)                             .enter()                                 .append('g')                                 .attr('class','node')                                 .attr('transform',function(d){                                     return 'translate('+d.y+','+d.x+')'                                 })                                                          // 4.4给节点添加圆圈,设置半径。                    node.append('circle')                         .attr('r',5);                     // 4.5给节点添加文本,设置文本的样式位置。                    node.append('text')                         .text(d=>d.name)                         .attr('dx',d=> d.children? -15:15)                         .attr('dy',5)                         .attr('text-anchor',d=> d.children? 'end':'start');                 })                                 

本文介绍的D3.js学习引导,仅供大家参考,如果更好的学习方式,请多多指教。感谢阅读,谢谢。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3