Vue和d3.js(v4)力导向图force结合使用,v3版本升级v4【一】
前段时间因为参与项目涉密,所以一直没有更新博客,有些博友给我私信或者留言要部分博文的源码,因为我的电脑更换,demo的源码没有备份 所以无法提供。大家可针对具体问题问我,有空我定会回复的。另外转发文章请说明出处,谢谢关注!
之前有多篇博文介绍了d3力导向图的绘制过程的一些问题,现在由于性能和UI的要求,要升级d3版本。因为v3版本现在使用的不多了,网上可找的资料不多且拓展性不好,因此花了点时间做了版本升级。
效果展示

初始化布局
this.force = d3.forceSimulation(nodes)
.force('link', d3.forceLink(links).id(d => d.id).strength(0.6).distance(Math.floor(height / 4)))
.force('charge', d3.forceManyBody().strength(-500).distanceMin(50).distanceMax(400))
.force('center', d3.forceCenter())
.force('collision', d3.forceCollide().radius(50))
.velocityDecay(0.5)
基础的配置,中文api里说的很清楚,d3-force
容器创建
let circles = null; // circle元素集合
let lines = null; // line元素集合
let gContainer = null; // 所有元素容器
let gCircle = null; // circle元素容器
let gLine = null; // line元素容器
let svg = null;
......
svg = d3.select('#svgForce')
.append('svg')
.attr('class', 'svg__container')
.attr('viewBox', [-width / 2, -height / 2, width, height])
// g容器,存放其他元素
gContainer = svg
.append('g')
.attr('class', 'force__container')
.attr('transform', 'translate(' + 10 + ',' + 10 + ')');
// 容器
gLine = gContainer.append('g').attr('class', 'force__line');
gCircle = gContainer.append('g').attr('class', 'force__circle');
容器创建,区分线和节点,便于维护和处理
Zoom缩放(仅附上关键代码,不可粘贴赋值直接实现哦~)
// zoom缩放
let zoom = d3.zoom()
.scaleExtent([0.5, 5])
.on('zoom', this.zoomed);
// 鼠标放大缩小
zoomed () {
const transform = d3.event.transform;
d3.selectAll('.force__container').attr('transform', transform);
}
....
svg.call(zoom)
Drag拖拽
// 拖拽
let drag = d3.drag()
.on('start', d => {
if (!d3.event.active) this.force.alphaTarget(0.8).restart(); // 当alpha为0 设置值让其动起来
d.fx = d.x;
d.fy = d.y;
})
.on('drag', d => {
d.fx = d3.event.x;
d.fy = d3.event.y;
d.drag = true;
this.force.force('center', null) // 允许随意拖动
})
.on('end', d => {
if (!d3.event.active) this.force.alphaTarget(0); // 静下来
})
circles = gCircle.selectAll('g')
.data(that.nodes, d => `circle${d.id}`)
.join('g')
.call(drag)
- d.fx 和 d.fy 表示设置拖拽固定的节点位置,如果想结束拽动后固定,需要在end中 删除2个值~
- 拖拽函数:
start,drag和end - 设置
this.force.force('center', null)是让节点随着拖动的位置随意飘动,不然你拽不走它的,它会被center的向心力吸引的
仿真tick
this.force.on('tick', () => {
circles.attr('transform', d => `translate(${d.x},${d.y})`);
lines.selectAll('path')
.attr('d', d => that.linkTick(d))
linkTick 是直线平行线的绘制方法,上篇博文有写,d3力导图绘制节点间多条关系平行线的方法
小结
本文主要写了下布局,拖拽,缩放一些基础方法的改变和使用。下篇将说一些最近调研的一些新玩意,包括文字加底色,线条加底色的方法。
Vue和d3.js(v4)力导向图force结合使用,v3版本升级v4【一】的更多相关文章
- D3.js:力导向图
var nodes = [ { name: "桂林" }, { name: "广州" }, { name: "厦门" }, { name: ...
- D3.js力导向图中新增节点及新增关系连线示例
大家在使用D3.js中的力导向图时,基本都会遇到动态增加节点及连线的需求,这里记录一下我的实现方式. 话不多说,先放代码: <!DOCTYPE html> <html lang=&q ...
- D3.js力导向图(适用于其他类型图)中后添加元素遮盖已有元素的问题解决
上一篇说了在D3.js中动态增加节点及连线的一种实现方式,但是有后添加元素遮盖原节点的现象,这一篇说一下出现这个现象的解决办法. 在D3.js中后添加的元素是会遮盖先添加的元素的,同时还有一个设定:后 ...
- D3.js 力导向图的显示优化
D3.js 作为一个前端,说到可视化除了听过 D3.js 的大名,常见的可视化库还有 ECharts.Chart.js,这两个库功能也很强大,但是有一个共同特点是封装层次高,留给开发者可设计和控制的部 ...
- D3.js 力导向图
花了大半天看了一个八十几行的代码..心累 力导向图是之前就有画过很多次的东西,但是这次的代码看上去很陌生,然后发现是D3更新了4.0.... 先贴代码 var svg = d3.select(&quo ...
- D3.js 力导向图的制作
力导向图中每一个节点都受到力的作用而运动,这种是一种非常绚丽的图表. 力导向图(Force-Directed Graph),是绘图的一种算法.在二维或三维空间里配置节点,节点之间用线连接,称为连线. ...
- D3.js系列——布局:饼状图和力导向图
一.饼状图 在布局的应用中,最简单的就是饼状图. 1.数据 有如下数据,需要可视化: , , , , ]; 这样的值是不能直接绘图的.例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终止角度,这些 ...
- D3.js 力导向图的拖拽(drag)与缩放(zoom)
不知道大家会不会跟我一样遇到这样的问题,在之前做的力导向图的基础上加上缩放功能的时候,拖动节点时整体会平移不再是之前酷炫的效果(失去了拉扯的感觉!).天啊,简直不能接受如此丑X的效果.经过不懈的努力终 ...
- d3.js(v5.7)力导向图(关系图谱)
先上图,后面再一一解释: ok,为了方便理解,这里我就没有用之前封装的automatch函数来将数据和节点匹配了,如果你对enter(),exit()函数还不是很理解的话,请移步至我之前写的<n ...
随机推荐
- C#开发笔记之04-如何用C#优雅的计算个人所得税?
C#开发笔记概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/960 访问. 首先,要对个人所得税的计算方式了解之后再 ...
- ubuntu升级已安装git版本
# To get the very latest version of git, you need to add the PPA (Personal Package Archive) from the ...
- unity3d学习笔记(一) 第一人称视角实现和倒计时实现
unity3d学习笔记(一) 第一人称视角实现和倒计时实现 1. 第一人称视角 (1)让mainCamera和player(视角对象)同步在一起 因为我们的player是生成的,所以不能把mainCa ...
- Java的注解浅析
人的一生就像一篇文章,只有经过多次精心修改,才能不断完善 Java注解概念理解: Java注解又称为Java标注,是JDK5引入的一中注释机制,Java中大家熟悉的五种注解分别是:@Override, ...
- Oracle数据库启动及状态等查询
一.监听 1)启动监听: lsnrctl start 2)查看监听状态: lsnrctl status 3)停止监听: lsnrctl stop 4)检查是否可进行网络连接: tnsping ${si ...
- troubleshoot之:分析OutOfMemoryError异常
目录 简介 OutOfMemoryError java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC Ov ...
- 如何选择一台适合Java开发的电脑
前言 最近在群里有同学求推荐Java开发用的电脑,所以胖哥就出个简单的专题,用我贫瘠的电脑知识来帮助大家选择适合开发的电脑配置.因为家里的主机已经带不动两个 IDEA 了,更别提开个 Docker 啥 ...
- get customer attribute option
Mage::getResourceSingleton('customer/customer')->getAttribute('gender')->getSource()->getAl ...
- Alpha阶段项目复审(小菜鸡联盟)
Alpha项目复审 小队:小菜鸡联盟 团队名称 项目名称 评价 排名 『S.L.N』 OnTime 优点:团队分工合理明确,每个成员有一定的开发经验,能用到自己较为熟悉的技术进行开发:在开发初期制定了 ...
- myblogplus 第二期 慕舲原创 如何删除官方在你博客内设置的所有广告
问题描述: 文章下方广告渐多了起来,这也无可厚非,原来只有小小一幅的,毕竟博客园团队很卖力,博客园首页不是在更新吗,博问也在推广(虽然解答者不多,提问者很多) 不过无疑很影响美观,那些可以让他设置,不 ...