d3.js学习笔记(六)树图

本文介绍了如何使用d3.js库来创建树形图,特别是如何通过横纵坐标交换构建出类似思维导图的视觉效果。树图是一种有效展示数据层次关系的图表,适用于多种数据可视化场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树形图直观的反应了数据之间的层次关系是现实应用中使用的比较普遍的一类图形化数据表示方法,使用d3.js绘制树状图的过程中,采取横纵坐标交换方式,可实现思维导图形式的树状图,示例代码如下:

        var width = 800,
            height = 800;

        //====================separation 表示设置节点间间隔,采用思维导图方式展示树状图,需要保持画板宽度大于画板高度=================================
        var tree = d3.layout.tree()
            .size([width, height-150])
            .separation(function (a, b) { return (a.parent == b.parent ? 1:2); });

        var diagonal = d3.svg.diagonal()
            .projection(function (d) { return [d.y, d.x]; });

        var svg = d3.select("body").append("svg")
            .attr("width", width)
            .attr("height", height)
            .append("g")
            .attr("transform", "translate(40,0)");
        

        d3.json("../data/city.json", function (error, root) {

            var nodes = tree.nodes(root);
            /*nodes.forEach(function (d) {
                d.y=
            });
            */

            //=============通过改变节点坐标,重新设置节点间的连线长度
            nodeSeperateSpace = 5;
            nodes.forEach(function (d) {
                d.x = d.x + d.depth * nodeSeperateSpace;
                //if (d.depth==0)
                    d.y = d.y - d.depth*50;
                //else
                    //d.y = d.y - 150;
            });

            var links = tree.links(nodes);

            console.log(nodes);
            console.log(links);

            var link = svg.selectAll(".link")
                .data(links)
                .enter()
                .append("path")
                .attr("class", "link")
                .attr("d", diagonal);

            //========================注意绘制节点时,节点的横纵坐标位置和数据的横纵坐标位置是相反的,这个树图的坐标计算算法有关============
            var node = svg.selectAll(".node")
                .data(nodes)
                .enter()
                .append("g")
                .attr("class", "node")
                .attr("transform", function (d) { return "translate(" + d.y + "," + d.x + ")"; })

            //============未设置圆的圆心坐标者,默认为0,0===============
            node.append("circle")
                .attr("r", 4.5);

            node.append("text")
                .attr("x", function (d) { return d.children ? -8 : 8; })
                .attr("y", 3)
                .style("text-anchor", function (d) { return d.children ? "end" : "start"; })
                .text(function (d) { return d.name; });
        });

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值