var width = this.$refs.topInfo.offsetWidth;
var height = this.$refs.topInfo.offsetHeight;
var img_w = 77;
var img_h = 80;
var radius = 30;
//console.log(width,height)
var svg = d3.select("#forceDirected")
.append("svg")
.attr("width",width)
.attr("height",height);
var marge = {top:10,bottom:10,left:10,right:10}
var g = svg.append("g")
.attr("transform","translate("+marge.top+","+marge.left+")");
//准备数据
var nodes = list.payload.data.vertices
var edges = list.payload.data.edges
for(var i=0 ; i < edges.length ; i++){
edges[i]['source'] = edges[i].bzrmc
edges[i]['target'] = edges[i].khmc
edges[i]['relation'] = edges[i].dblx
}
edges.forEach(function (e) {
var sourceNode = nodes.filter(function (n) {
return n.name === e.source;
})[0],
targetNode = nodes.filter(function (n) {
return n.name === e.target;
})[0];
e.source = targetNode
e.target = sourceNode
});
// console.log(edges,nodes)
 
//设置一个color的颜色比例尺,为了让不同的扇形呈现不同的颜色
var colorScale = d3.scaleOrdinal()
.domain(d3.range(nodes.length))
.range(d3.schemeCategory10);
var forceSimulation = d3.forceSimulation()
.force("link",d3.forceLink().id(function(d){return d.id}))
.force("charge",d3.forceManyBody().strength(-300).distanceMax(200))
.force("center",d3.forceCenter(width/2,height/2))
 
//生成节点数据
forceSimulation.nodes(nodes)
.on("tick",ticked)//这个函数很重要,后面给出具体实现和说明
 
//生成边数据
forceSimulation.force("link")
.links(edges)
.distance(function(d){//每一边的长度
return 130;
})
//设置图形的中心位置
forceSimulation.force("center")
.x(width/2)
.y(height/2);
//在浏览器的控制台输出
// console.log(nodes);
//console.log(edges);
//绘制边
var links = g.append("g")
.selectAll("line")
.data(edges)
.enter()
.append("line")
.attr("stroke",function(d,i){
// console.log(d.value)
return colorScale(d.value); //边的颜色
//return "#ccc";
})
.attr("stroke-width",1)
.attr("marker-end", "url(#resolved)" );//根据箭头标记的id号引用箭头;
var marker= g.append("marker")
// .selectAll("line")//注意SVG规范中明确指出,附加到一个'Marker'元素上的“事件属性和事件的listener”不会被处理
// g.append("marker")//添加一个marker标签来绘制箭头
.attr("id", "resolved")//箭头id,用于其他标记进行引用时的url
.attr("markerUnits","userSpaceOnUse")//定义标记的坐标系统,userSpaceOnUse表示按照引用的元件来决定,strokeWidth按照用户单位决定
.attr("viewBox", "0 -5 10 10")//坐标系的区域
.attr("refX",24)//箭头坐标
.attr("refY", 0)
.attr("markerWidth", 12)//标识的大小
.attr("markerHeight", 12)
.attr("orient", "auto")//绘制方向,可设定为:auto(自动确认方向)和 角度值
.attr("stroke-width",3)//箭头宽度
.append("path")
.attr("d", "M0,-5L10,0L0,5")//绘制箭头,路径为一个三角形,有疑问参考svg的path http://www.runoob.com/svg/svg-path.html
.attr('fill','red');//箭头颜色
//边上文字
var linksText = g.append("g")
.selectAll("text")
.data(edges)
.enter()
.append("text")
.text(function(d){
return d.relation;
})
//建立用来放在每个节点和对应文字的分组<g>
var gs = g.selectAll(".circleText")
.data(nodes)
.enter()
.append("g")
.attr("transform",function(d,i){
// console.log(d,i)
var cirX = d.x;
var cirY = d.y;
return "translate("+cirX+","+cirY+")";
})
.call(d3.drag()
.on("start",started)
.on("drag",dragged)
.on("end",ended)
);
gs.append("image")
.attr("xlink:href",this.peopleUrl)
.attr("width",60)
.attr("height",60)
.attr("x",-35)
.attr("y",-30)
.attr("dy",10)
 
//文字
gs.append("text")
/*.attr("x",-10)
.attr("y",-20)
.attr("dy",10)*/
.attr("id","textclass")
.attr("x",-25)
.attr("y",30)
.attr("dy",10)
.text(function(d){
return d.name;
})
function ticked(){
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;});
linksText
.attr("x",function(d){
return (d.source.x+d.target.x)/2;
})
.attr("y",function(d){
return (d.source.y+d.target.y)/2;
});
 
gs
.attr("transform",function(d) { return "translate(" + d.x + "," + d.y + ")"; });
}
//drag
function started(d){
if(!d3.event.active){
forceSimulation.alphaTarget(0.8).restart();//设置衰减系数,对节点位置移动过程的模拟,数值越高移动越快,数值范围[0,1]
}
d.fx = d.x;
d.fy = d.y;
}
function dragged(d){
d.fx = d3.event.x;
d.fy = d3.event.y;
}
function ended(d){
if(!d3.event.active){
forceSimulation.alphaTarget(0);
}
d.fx = null;
d.fy = null;
}

d3.js V5版本在vue里使用 自定义节点图片的更多相关文章

  1. D3.js v4版本 按住shift键框选节点demo

    http://download.csdn.net/download/qq_25042329/10139649

  2. D3.js v5 Tutorials

    D3.js v5 Tutorials D3.js v5 教程 https://github.com/d3/d3/blob/master/API.md CHANGES https://github.co ...

  3. pixi.js v5版本出了。

    历尽千辛万苦,pixi.js v5版本出了. 请关注群 881784250, 会尽块出个微信小游戏版. pixi.js的每个函数,每个类都有测试用例的.出的版本都是很稳定的.

  4. D3.js V5 教程

    D3.js V5 教程 1.在项目中使用D3.js 2. 选择元素和设置(获取)属性 3. 绑定数据 4. 理解Update.Enter.Exit 与 添加.删除元素 未完待续..........

  5. vue里在自定义的组件上定义的事件

    事件分为原生事件和自定义事件. vue里在自定义的组件上定义的事件,都被认为是自定义事件,必须用$emit()来触发. 这也是子组件向父传值的原理. 如果想作为原生事件,需要在原生事件后面加上.nat ...

  6. 用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛

    前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为使用 ES6 语法. 源码: gi ...

  7. D3.js的v5版本入门教程(第十三章)—— 饼状图

    D3.js的v5版本入门教程(第十三章) 这一章我们来绘制一个简单的饼状图,我们只绘制构成饼状图基本的元素——扇形.文字,从这一章开始,内容可能有点难理解,因为每一章都会引入比较多的难理解知识点,在这 ...

  8. D3.js的v5版本入门教程(第十二章)—— D3.js中各种精美的图形

    D3.js的v5版本入门教程(第十二章) D3中提供了各种制作常见图形的函数,在d3的v3版本中叫布局,通过d3.layout.xxx,来新建,但是到了v5,新建一个d3中基本的图形的方式变了(我也并 ...

  9. D3.js的v5版本入门教程(第十一章)——交互式操作

    D3.js的v5版本入门教程(第十一章) 与图形进行交互操作是很重要的!所谓的交互操作也就是为图形元素添加监听事件,比如说当你鼠标放在某个图形元素上面的时候,就会显示相应的文字,而当鼠标移开后,文字就 ...

随机推荐

  1. 机器学习-利用pickle加载cifar文件

    首先这里有百度云的数据集供大家下载:(官网太慢了) 链接:https://pan.baidu.com/s/1G0MxZIGSK_DyZTcuNbxraQ 提取码:ui51 复制这段内容后打开百度网盘手 ...

  2. Java EE.JSP.动作组件

    常见的JSP动作组件有以下几种: 1)<jsp:include>:在页面被请求的时候引入一个文件 2)<jsp:param>:在动作组件中引入参数信息 3)<jsp:fo ...

  3. MetInfo5.3管理员密码重置漏洞

    点击忘记密码 下一步 输入已知用户名或者邮箱点击下一步用Burp拦截 右键发送到Repeater 在第一行php后面拼接?met_host虚拟机kali的ip地址:端口号拼接完成后 用虚拟机监听拼接的 ...

  4. python课堂整理7---集合

    前面小节: sep 用来控制每个元素间的间隔符号 print("alex", "dabai", "liu", sep = "&qu ...

  5. linux初学者-ftp篇(一)

    linux初学者-ftp篇(一) FTP是文件传输协议,是用于Internet上的控制文件的双向传输.用户可以通过客户机程序从远程主机上下载或者向远程主机上传文件. linux系统中,如果不了解SEL ...

  6. 这半年时间学Mysql的总结

    一条sql语句的执行流程 select * from t where id=1 1.mysql执行一条查询语句的流程 1.1客户端输入用户名密码连接mysql服务器 1.2查询这条sql语句有没有对应 ...

  7. 游戏开发3D基础知识

    概念学习: 向量 向量简介 我们将所有彼此平行的向量进行平移,使其起点与坐标原点重合,当某一向量的起始端与坐标原点重合,我们成该向量处于标准位置.这样,我们就可用向量的终点坐标来描述一个处于标准位置的 ...

  8. c#小灶——初识c#

    提到c#,就不得不说.net,.net是微软开发的一个平台,简单来说,在这个平台上,可以编写.运行程序.可能很多人觉得这个平台离我们很遥远,其实不然,这个平台就一直在我们的windows操作系统里,默 ...

  9. 保存MTLAB图片是想去掉白边

    在做一些matlab小实验的时候,生成的图片需要临时保存的时候会有多余的白边,如何能解决这种问题? 输入 iptsetpref('ImshowBorder','tight'); 后,再show一次图即 ...

  10. jdk8与jdk7中hashMap的resize分析

    在分析代码之前,我们先抛出下面的问题: hashmap 扩容时每个 entry 需要再计算一次 hash 吗? 我们首先看看jdk7中的hashmap的resize实现 1 void resize(i ...