d3.js(v5.7)力导向图(关系图谱)

先上图,后面再一一解释:

image.png

ok,为了方便理解,这里我就没有用之前封装的automatch函数来将数据和节点匹配了,如果你对enter(),exit()函数还不是很理解的话,请移步至我之前写的《node与数据匹配》(automatch函数)

那么接下来:

一、声明全局变量

因为力导向图,涉及到众多节点的运动,并且在写的时候都是以callback的形式去操作这些节点,所以这里我们将这些节点声明为全局变量(应该也是可以直接声明在组件的data里面的,如果你有兴趣,不妨一试)

image.png

这些注释应该都详细了吧。

二、开始布局画布

image.png

不难看出,在900x500的svg画布上,添加了一个g标签作为绘图的起点(60,60),并新建一个力导向图

三、处理节点数据、关系数据

image.png

四、数据处理好之后,开始绘图

①线和线上文字

image.png

②节点和节点面描述(他两是一组)

因为是一组,所以他两外面要用g标签包裹,就和之前绘完整柱形图时一样

image.png

五、辅助函数

主函数中用到了4个辅助函数,其中一个用于初始化线的位置和线上文本位置以及节点分组的位置;

其他三个则用于控制节点分组拖拽时候的自己以及其他节点的位置:image.png

六、官方相关API截图

image.png

转载于:https://www.cnblogs.com/eco-just/p/10035970.html

d3.js是一个基于数据操作文档的JavaScript库,可以帮助开发者使用HTML、SVG和CSS来展示数据。d3.js可以用来实现人物关系图谱,具体实现步骤如下: ```javascript // 引入d3.js库 <script src="https://d3js.org/d3.v3.min.js"></script> // 创建svg元素 var svg = d3.select("body") .append("svg") .attr("width", width) .attr("height", height); // 创建导向 var force = d3.layout.force() .nodes(nodes) // 节点数组 .links(links) // 连线数组 .size([width, height]) // 画布大小 .linkDistance(150) // 连线长度 .charge(-400); // 节点间的斥 // 绘制连线 var links = svg.selectAll(".link") .data(links) .enter() .append("line") .attr("class", "link"); // 绘制节点 var nodes = svg.selectAll(".node") .data(nodes) .enter() .append("circle") .attr("class", "node") .attr("r", 20) .style("fill", function(d) { return color(d.group); }) .call(force.drag); // 节点可拖拽 // 绘制节点标签 var labels = svg.selectAll(".label") .data(nodes) .enter() .append("text") .attr("class", "label") .attr("fill", "black") .attr("font-size", "12px") .attr("dx", 20) .attr("dy", 8) .text(function(d) { return d.name; }); // 开始导向布局 force.start(); // 监听导向布局事件 force.on("tick", function() { // 更新连线位置 links.attr("x1", function(d) { return d.source.x; }) .attr("y1", function(d) { return d.source.y; }) .attr("x2", function(d) { return d.target.x; }) .attr("y2", function(d) { return d.target.y; }); // 更新节点位置 nodes.attr("cx", function(d) { return d.x; }) .attr("cy", function(d) { return d.y; }); // 更新节点标签位置 labels.attr("x", function(d) { return d.x; }) .attr("y", function(d) { return d.y; }); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值