svg 树状图_d3 树状布局tree

树状布局Tree-Layout简介

显而易见,树状布局就是我们通常所理解的数据结构中的树,由一个根节点向外展开,与前面力导向图的数据结构模型其实是一致的,只是展示形式略有差别,用树状结构展示看起来更加简洁清晰一点。

API

树结构

d3.layout.tree()

使用默认设置创建一个新的树状布局:

tree.nodes(root)

根据传入数据计算树的布局返回一组节点数组

tree.links(nodes)

根据节点数组返回节点之间的父子连接关系

tree.separation([separation]):

设置或取得两个节点之间的间距

tree.size([size])

指定树布局的尺寸一个

svg形状

因为需要实现一个辐射布局,并且连线是贝塞尔曲线,需要用到坐标投影来实现路径形状生成。

路径形状有很多种选择,比如d3.svg.line()、d3.svg.area()、d3.svg.diagonal()等等。这里选用d3.svg.diagonal(),它能利用projection的API来生成svg中的path形状的路径。

d3.svg.diagonal.radial().projection()

示例代码

根据官网一些人提供的Demo修改来写了一个辐射布局。里面做了一些注释,但仍然有一些疑惑点,比如d.x-90那里的原因还是比较模糊。

下面是完整demo代码

tree layout

.node {

cursor: pointer;

}

.node circle {

fill: #fff;

stroke: steelblue;

stroke-width: 1.5px;

}

.node text {

font: 10px sans-serif;

}

.link {

fill: none;

stroke: #ccc;

stroke-width: 1.5px;

}

var width = 800,

height = 800;

var i = 0,

duration = 6000,

root;

var tree = d3.layout.tree()

.size([360, 320]) //360代表展开的最大角度也就是圆,后面的r值代表整个辐射布局的展开最大半径,并不是指某一层级的半径而是整个树,超过这个范围的就不显示了,后面85行d.y的才是某一层级的半径设置。

.separation(function(a, b) {

return (a.parent == b.parent ? 1 : 2) / a.depth; //适应radial布局,可以简单的理解为深度越高,相邻子节点之间的距离越小。

});

var diagonal = d3.svg.diagonal.radial()

.projection(function(d) { return [d.y, d.x / 180 * Math.PI]; }); //d.y代表半径,(d.x/180)*PI就是各个节点的弧度表示。

var svg = d3.select("body").append("svg")

.attr("width", width)

.attr("height", height)

.append("g")

.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

d3.json("flare1.json", f

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
d3.js树状图具有交互效果的展开折叠可以通过以下步骤来实现: 1. 定义布局,设置节点大小和节点之间的间隔: ``` const treeLayout = d3.tree().nodeSize([height, width]); ``` 2. 加载数据,生成形结构: ``` const root = d3.hierarchy(data); const treeData = treeLayout(root); ``` 3. 定义节点和连线的生成器: ``` const nodeGenerator = d3 .linkHorizontal() .x((d) => d.y) .y((d) => d.x); const linkGenerator = d3 .linkHorizontal() .x((d) => d.y) .y((d) => d.x); ``` 4. 绘制节点: ``` const nodes = svg .selectAll("g.node") .data(treeData.descendants()) .enter() .append("g") .attr("class", "node") .attr("transform", (d) => `translate(${d.y},${d.x})`) .on("click", (d) => { if (d.children) { d._children = d.children; d.children = null; } else { d.children = d._children; d._children = null; } update(d); }); nodes.append("circle").attr("r", 10); nodes .append("text") .attr("dx", 12) .attr("dy", 4) .text((d) => d.data.name); ``` 5. 绘制连线: ``` const links = svg .selectAll("path.link") .data(treeData.links()) .enter() .append("path") .attr("class", "link") .attr("d", linkGenerator); ``` 6. 定义更新函数,用于更新节点和连线: ``` function update(source) { const nodes = svg.selectAll("g.node").data(treeData.descendants()); const links = svg.selectAll("path.link").data(treeData.links()); nodes .enter() .append("g") .attr("class", "node") .attr("transform", (d) => `translate(${source.y0},${source.x0})`) .merge(nodes) .transition() .duration(500) .attr("transform", (d) => `translate(${d.y},${d.x})`); nodes.exit().remove(); nodes .select("circle") .attr("r", 10) .attr("class", (d) => (d._children ? "collapsed" : "")); links .enter() .append("path") .attr("class", "link") .attr("d", () => { const o = { x: source.x0, y: source.y0 }; return linkGenerator({ source: o, target: o }); }) .merge(links) .transition() .duration(500) .attr("d", linkGenerator); links.exit().remove(); treeData.descendants().forEach((d) => { d.x0 = d.x; d.y0 = d.y; }); } ``` 7. 定义CSS样式,用于控制节点的展开和折叠: ``` .collapsed { fill: white; stroke: steelblue; stroke-width: 2px; } ``` 以上是实现具有交互效果的展开折叠的树状图的基本步骤,具体的实现还需要根据实际需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值