D3.js绘制树形图

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":"地图"}
        ]
    }
]
}

 

 <!-- 代码实现 -->

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>d3-tree树图实现</title>
        <style type="text/css">
          
 /* 圈圈节点样式 */
            .node circle{
                fill: #fff;
                stroke: steelblue;
                stroke-width:1.5px;
            }
          
 /* 文字样式 */
            .node text{
                font-size: 12px;
            }
          
 /* 连线的样式 */
            .link{
                fill: none;
                stroke: #ccc;
                stroke-width: 1.5px;
            }
        </style>

    </head>
    <body>
        <!-- 0.引入d3.js库 -->
        <script src="https://d3js.org/d3.v3.js"></script>
        <script type="text/javascript">
          
 // 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');
                })
                  
        </script>

    </body>
</html>

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

好的,让我来回答你关于 Vue 和 D3.js 结合实现树形图的问题。 首先,需要安装 D3.js 库和 Vue.js 库。可以通过 npm 命令进行安装,如下所示: ``` npm install d3 vue ``` 接下来,创建一个 Vue 组件,在其中引入 D3.js 库。在组件的 mounted 钩子函数中,可以使用 D3.js 创建树形图。 具体实现步骤如下: 1. 在 Vue 组件中引入 D3.js 库 ```javascript import * as d3 from 'd3'; ``` 2. 在 mounted 钩子函数中创建树形图 ```javascript mounted() { const data = { name: "root", children: [ { name: "child1", children: [ { name: "child1.1" }, { name: "child1.2" } ] }, { name: "child2", children: [ { name: "child2.1" }, { name: "child2.2" } ] } ] }; const margin = { top: 10, right: 120, bottom: 10, left: 40 }; const width = 960 - margin.width - margin.left; const height = 500 - margin.top - margin.bottom; const root = d3.hierarchy(data); root.dx = 10; root.dy = width / (root.height + 1); d3.tree().nodeSize([root.dx, root.dy])(root); const svg = d3.select("#tree") .attr("width", width + margin.right + margin.left) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); const link = svg.selectAll(".link") .data(root.descendants().slice(1)) .enter().append("path") .attr("class", "link") .attr("d", d => { return "M" + d.y + "," + d.x + "C" + (d.y + d.parent.y) / 2 + "," + d.x + " " + (d.y + d.parent.y) / 2 + "," + d.parent.x + " " + d.parent.y + "," + d.parent.x; }); const node = svg.selectAll(".node") .data(root.descendants()) .enter().append("g") .attr("class", d => "node" + (d.children ? " node--internal" : " node--leaf")) .attr("transform", d => "translate(" + d.y + "," + d.x + ")"); node.append("circle") .attr("r", 2.5); node.append("text") .attr("dy", 3) .attr("x", d => d.children ? -6 : 6) .style("text-anchor", d => d.children ? "end" : "start") .text(d => d.data.name); } ``` 3. 在组件的模板中添加 SVG 元素 ```html <template> <svg id="tree"></svg> </template> ``` 这样就实现了一个简单的树形图。你可以根据自己的需求,对节点和链接进行样式等方面的修改。 希望这个例子能够对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值