亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

d3.js實現簡單的網絡拓撲圖實例代碼

2019-11-19 19:03:15
字體:
來源:轉載
供稿:網友

前言

了解了D3.js的基本開發和組件以后,我們開始應用它激動人心之處:絢麗的預定義圖形,應用D3.js,我們在它的示例文件的基礎上稍加變動即可應用于我們的數據可視化工作中,D3.js將后臺的運算已經預定義好,我們只需少量代碼和規范的數據,就能做出很花哨(請原諒我的用詞不當)的效果。

力學圖(也稱為導向圖,也有叫網絡拓補圖的,反正就是通過排斥得到關系遠近的結構)在社交網絡研究、信息傳播途徑等群體關系研究中應用非常廣泛,它可以直觀地反映群體與群體之間聯系的渠道、交集多少,群體內部成員的聯系強度等。

本文實現如下面的效果(用非IE瀏覽器可以看到效果):

代碼有點長,但是也不復雜,可以參考如下代碼:

<!DOCTYPE html><html><head><script type="text/javascript" src="http://mbostock.github.com/d3/d3.v2.js?2.9.1"></script><style type="text/css">.link { stroke: green; stroke-linejoin:bevel;}.link_error{ stroke:red; stroke-linejoin:bevel;}.nodetext { font: 12px sans-serif; -webkit-user-select:none; -moze-user-select:none; stroke-linejoin:bevel; }#container{ width:800px; height:600px; border:1px solid gray; border-radius:5px; position:relative; margin:20px;}</style></head><body> <div id='container'></div><script type="text/javascript">function Topology(ele){ typeof(ele)=='string' && (ele=document.getElementById(ele)); var w=ele.clientWidth, h=ele.clientHeight, self=this; this.force = d3.layout.force().gravity(.05).distance(200).charge(-800).size([w, h]); this.nodes=this.force.nodes(); this.links=this.force.links(); this.clickFn=function(){}; this.vis = d3.select(ele).append("svg:svg")   .attr("width", w).attr("height", h).attr("pointer-events", "all"); this.force.on("tick", function(x) { self.vis.selectAll("g.node")  .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); self.vis.selectAll("line.link")  .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; }); });}Topology.prototype.doZoom=function(){ d3.select(this).select('g').attr("transform","translate(" + d3.event.translate + ")"+ " scale(" + d3.event.scale + ")");}//增加節點Topology.prototype.addNode=function(node){ this.nodes.push(node);}Topology.prototype.addNodes=function(nodes){ if (Object.prototype.toString.call(nodes)=='[object Array]' ){ var self=this; nodes.forEach(function(node){  self.addNode(node); }); }}//增加連線Topology.prototype.addLink=function(source,target){ this.links.push({source:this.findNode(source),target:this.findNode(target)});}//增加多個連線Topology.prototype.addLinks=function(links){ if (Object.prototype.toString.call(links)=='[object Array]' ){ var self=this; links.forEach(function(link){  self.addLink(link['source'],link['target']); }); }}//刪除節點Topology.prototype.removeNode=function(id){ var i=0, n=this.findNode(id), links=this.links; while ( i < links.length){ links[i]['source']==n || links[i]['target'] ==n ? links.splice(i,1) : ++i; } this.nodes.splice(this.findNodeIndex(id),1);}//刪除節點下的子節點,同時清除link信息Topology.prototype.removeChildNodes=function(id){ var node=this.findNode(id), nodes=this.nodes; links=this.links, self=this; var linksToDelete=[], childNodes=[];  links.forEach(function(link,index){ link['source']==node   && linksToDelete.push(index)   && childNodes.push(link['target']); }); linksToDelete.reverse().forEach(function(index){ links.splice(index,1); }); var remove=function(node){ var length=links.length; for(var i=length-1;i>=0;i--){  if (links[i]['source'] == node ){  var target=links[i]['target'];  links.splice(i,1);  nodes.splice(self.findNodeIndex(node.id),1);  remove(target);    } } } childNodes.forEach(function(node){ remove(node); }); //清除沒有連線的節點 for(var i=nodes.length-1;i>=0;i--){ var haveFoundNode=false; for(var j=0,l=links.length;j<l;j++){  ( links[j]['source']==nodes[i] || links[j]['target']==nodes[i] ) && (haveFoundNode=true)  } !haveFoundNode && nodes.splice(i,1); }}//查找節點Topology.prototype.findNode=function(id){ var nodes=this.nodes; for (var i in nodes){ if (nodes[i]['id']==id ) return nodes[i]; } return null;}//查找節點所在索引號Topology.prototype.findNodeIndex=function(id){ var nodes=this.nodes; for (var i in nodes){ if (nodes[i]['id']==id ) return i; } return -1;}//節點點擊事件Topology.prototype.setNodeClickFn=function(callback){ this.clickFn=callback;}//更新拓撲圖狀態信息Topology.prototype.update=function(){ var link = this.vis.selectAll("line.link") .data(this.links, function(d) { return d.source.id + "-" + d.target.id; }) .attr("class", function(d){  return d['source']['status'] && d['target']['status'] ? 'link' :'link link_error'; }); link.enter().insert("svg:line", "g.node") .attr("class", function(d){  return d['source']['status'] && d['target']['status'] ? 'link' :'link link_error'; }); link.exit().remove(); var node = this.vis.selectAll("g.node") .data(this.nodes, function(d) { return d.id;}); var nodeEnter = node.enter().append("svg:g") .attr("class", "node") .call(this.force.drag); //增加圖片,可以根據需要來修改 var self=this; nodeEnter.append("svg:image") .attr("class", "circle") .attr("xlink:href", function(d){  //根據類型來使用圖片  return d.expand ? "http://ww2.sinaimg.cn/large/412e82dbjw1dsbny7igx2j.jpg" : "http://ww4.sinaimg.cn/large/412e82dbjw1dsbnxezrrpj.jpg"; }) .attr("x", "-32px") .attr("y", "-32px") .attr("width", "64px") .attr("height", "64px") .on('click',function(d){ d.expand && self.clickFn(d);}) nodeEnter.append("svg:text") .attr("class", "nodetext") .attr("dx", 15) .attr("dy", -35) .text(function(d) { return d.id });  node.exit().remove(); this.force.start();}var topology=new Topology('container');var nodes=[ {id:'10.4.42.1',type:'router',status:1}, {id:'10.4.43.1',type:'switch',status:1,expand:true}, {id:'10.4.44.1',type:'switch',status:1}, {id:'10.4.45.1',type:'switch',status:0}];var childNodes=[ {id:'10.4.43.2',type:'switch',status:1}, {id:'10.4.43.3',type:'switch',status:1}];var links=[ {source:'10.4.42.1',target:'10.4.43.1'}, {source:'10.4.42.1',target:'10.4.44.1'}, {source:'10.4.42.1',target:'10.4.45.1'}];var childLinks=[ {source:'10.4.43.1',target:'10.4.43.2'}, {source:'10.4.43.1',target:'10.4.43.3'}, {source:'10.4.43.2',target:'10.4.43.3'}]topology.addNodes(nodes);topology.addLinks(links);//可展開節點的點擊事件topology.setNodeClickFn(function(node){ if(!node['_expanded']){ expandNode(node.id); node['_expanded']=true; }else{ collapseNode(node.id); node['_expanded']=false; }});topology.update();function expandNode(id){ topology.addNodes(childNodes); topology.addLinks(childLinks); topology.update();}function collapseNode(id){ topology.removeChildNodes(id); topology.update();}</script></body></html>

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以了留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产97在线|日韩| 久久久国产精品亚洲一区| 91在线高清视频| 国产一区二区成人| 中文字幕无线精品亚洲乱码一区| 福利微拍一区二区| 2019中文字幕全在线观看| 亚洲成人av在线播放| 精品中文字幕在线观看| 久久久久一本一区二区青青蜜月| 91久久久久久久| 日韩国产在线看| 亚洲精品国产福利| 亚洲欧美日韩中文在线制服| 欧美日韩亚洲精品一区二区三区| 91在线精品视频| 97**国产露脸精品国产| 亚洲国产精品成人精品| 国产精品精品视频| 97成人超碰免| 国产精品免费一区二区三区都可以| 国产日韩精品在线观看| 久久久91精品| 国产精品永久免费观看| 久久69精品久久久久久国产越南| 国产精品一久久香蕉国产线看观看| 亚洲精品不卡在线| 亚洲人成电影在线播放| 国产精品久久久久久久久粉嫩av| 国产在线精品播放| 疯狂蹂躏欧美一区二区精品| 国产精品爱久久久久久久| 国产一区二区三区视频| 久久久久久尹人网香蕉| 亚洲а∨天堂久久精品喷水| 国产精品国语对白| 国产亚洲成精品久久| 精品久久久香蕉免费精品视频| 国产日韩欧美黄色| 日韩av网站在线| 色偷偷综合社区| 亚洲国产精品嫩草影院久久| 中文字幕欧美专区| 韩国v欧美v日本v亚洲| 国产精品专区h在线观看| 亚洲区一区二区| 久热在线中文字幕色999舞| 久久综合国产精品台湾中文娱乐网| 亚洲精品久久久久国产| 欧美激情欧美激情| 国产亚洲欧美另类中文| 91精品视频专区| 91精品视频在线播放| 日韩欧美高清视频| 两个人的视频www国产精品| 亚洲高清久久网| 国产美女主播一区| 国产精品电影在线观看| 欧洲日本亚洲国产区| 欧美精品成人91久久久久久久| 欧美一区三区三区高中清蜜桃| 精品久久久av| 亚洲女人天堂视频| 最新的欧美黄色| 亚洲直播在线一区| 欧美丝袜第一区| 奇门遁甲1982国语版免费观看高清| 欧美日韩国产中文字幕| 精品毛片三在线观看| 91在线观看免费高清| 亚洲免费一在线| 国产一区二区三区视频| 日韩欧美中文字幕在线观看| 久久99视频精品| 国产久一一精品| 欧洲精品毛片网站| 国产成人精品视频在线观看| 国产精品久久激情| 26uuu国产精品视频| 亚洲r级在线观看| 91av视频导航| 国产精品视频一区国模私拍| 亚洲成人av片在线观看| 一区二区三区www| 国产亚洲欧美aaaa| www.日韩系列| 国产一区私人高清影院| 成人亚洲综合色就1024| 97香蕉超级碰碰久久免费的优势| 国产日韩精品综合网站| 在线播放国产精品| 色偷偷av亚洲男人的天堂| 国产精品偷伦一区二区| 国产香蕉97碰碰久久人人| 国产一区二区三区高清在线观看| 久久久久久久一区二区| 久久久免费在线观看| 国产精品一区二区三区毛片淫片| 在线看欧美日韩| 日本成人黄色片| 91精品国产91久久久久福利| 日韩有码在线视频| 国产香蕉一区二区三区在线视频| 黑人巨大精品欧美一区二区三区| 久久av中文字幕| 久久在精品线影院精品国产| 国产视频在线观看一区二区| 亚洲性线免费观看视频成熟| 亚洲最新视频在线| 国产在线视频不卡| 成人福利免费观看| 91国内免费在线视频| 色综合久综合久久综合久鬼88| 欧美大片欧美激情性色a∨久久| 国产成人一区二区| 国产一区玩具在线观看| 精品视频在线播放色网色视频| 亚洲欧美制服丝袜| 国产精品视频一区国模私拍| 午夜精品久久久久久久99热| 欧美激情一二三| 一区二区在线视频播放| 日本欧美中文字幕| 国产日本欧美在线观看| 精品久久久一区二区| 国产精品黄色影片导航在线观看| 久久全球大尺度高清视频| 午夜精品美女自拍福到在线| 日韩激情av在线免费观看| 亚洲欧美日韩高清| 日韩精品高清视频| 国产成人啪精品视频免费网| 国产精品丝袜久久久久久高清| 国产亚洲在线播放| 精品福利在线视频| 国产精品福利观看| 91视频国产精品| 琪琪亚洲精品午夜在线| 欧美一级视频在线观看| 影音先锋日韩有码| 欧美一级大片在线免费观看| 91亚洲精品在线观看| www国产亚洲精品久久网站| 国产精品视频久久久| 日韩欧美亚洲范冰冰与中字| 日韩国产激情在线| 97涩涩爰在线观看亚洲| 欧美大人香蕉在线| 亚洲国产成人91精品| 久久久精品久久久久| 欧美富婆性猛交| 91在线视频精品| 国产日韩精品在线| 夜夜嗨av一区二区三区免费区| 亚洲成人激情视频| 欧美激情区在线播放| 国产欧美va欧美va香蕉在| 色偷偷偷综合中文字幕;dd| 日韩成人激情在线| 国产精品永久免费在线| 国产欧美 在线欧美| 亚洲最大福利视频网站| 久久精品国产99国产精品澳门| 亚洲精品久久久久国产|