最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

d3.js實(shí)現(xiàn)簡單的網(wǎng)絡(luò)拓?fù)鋱D實(shí)例代碼

 更新時(shí)間:2016年11月06日 09:26:21   投稿:daisy  
最近一直在學(xué)習(xí)d3.js,大家都知道d3.js是一個(gè)非常不錯(cuò)的數(shù)據(jù)可視化庫,我們可以用它來做一些比較酷的東西,比如可以來顯示一些簡單的網(wǎng)絡(luò)拓?fù)鋱D,這篇文中就通過實(shí)例代碼給大家介紹了如何利用d3.js實(shí)現(xiàn)簡單的網(wǎng)絡(luò)拓?fù)鋱D,有需要的朋友們可以參考借鑒,下面來一起看看吧。

前言

了解了D3.js的基本開發(fā)和組件以后,我們開始應(yīng)用它激動(dòng)人心之處:絢麗的預(yù)定義圖形,應(yīng)用D3.js,我們?cè)谒氖纠募幕A(chǔ)上稍加變動(dòng)即可應(yīng)用于我們的數(shù)據(jù)可視化工作中,D3.js將后臺(tái)的運(yùn)算已經(jīng)預(yù)定義好,我們只需少量代碼和規(guī)范的數(shù)據(jù),就能做出很花哨(請(qǐng)?jiān)徫业挠迷~不當(dāng))的效果。

力學(xué)圖(也稱為導(dǎo)向圖,也有叫網(wǎng)絡(luò)拓補(bǔ)圖的,反正就是通過排斥得到關(guān)系遠(yuǎn)近的結(jié)構(gòu))在社交網(wǎng)絡(luò)研究、信息傳播途徑等群體關(guān)系研究中應(yīng)用非常廣泛,它可以直觀地反映群體與群體之間聯(lián)系的渠道、交集多少,群體內(nèi)部成員的聯(lián)系強(qiáng)度等。

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

代碼有點(diǎn)長,但是也不復(fù)雜,可以參考如下代碼:

<!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 + ")");

}


//增加節(jié)點(diǎn)
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)});
}

//增加多個(gè)連線
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']);
 });
 }
}


//刪除節(jié)點(diǎn)
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);
}

//刪除節(jié)點(diǎn)下的子節(jié)點(diǎn),同時(shí)清除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);
 });

 //清除沒有連線的節(jié)點(diǎn)
 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);
 }
}



//查找節(jié)點(diǎn)
Topology.prototype.findNode=function(id){
 var nodes=this.nodes;
 for (var i in nodes){
 if (nodes[i]['id']==id ) return nodes[i];
 }
 return null;
}


//查找節(jié)點(diǎn)所在索引號(hào)
Topology.prototype.findNodeIndex=function(id){
 var nodes=this.nodes;
 for (var i in nodes){
 if (nodes[i]['id']==id ) return i;
 }
 return -1;
}

//節(jié)點(diǎn)點(diǎn)擊事件
Topology.prototype.setNodeClickFn=function(callback){
 this.clickFn=callback;
}

//更新拓?fù)鋱D狀態(tài)信息
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);

 //增加圖片,可以根據(jù)需要來修改
 var self=this;
 nodeEnter.append("svg:image")
 .attr("class", "circle")
 .attr("xlink:href", function(d){
  //根據(jù)類型來使用圖片
  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);
//可展開節(jié)點(diǎn)的點(diǎn)擊事件
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>

總結(jié)

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

相關(guān)文章

  • JavaScript數(shù)據(jù)類型的存儲(chǔ)方法詳解

    JavaScript數(shù)據(jù)類型的存儲(chǔ)方法詳解

    JavaScript中基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是如何存儲(chǔ)的呢?下面通過本文給大家分享js數(shù)據(jù)類型的存儲(chǔ)方法,需要的朋友參考下吧
    2017-08-08
  • 微信小程序 自定義彈窗實(shí)現(xiàn)過程(附代碼)

    微信小程序 自定義彈窗實(shí)現(xiàn)過程(附代碼)

    這篇文章主要介紹了微信小程序 自定義彈窗實(shí)現(xiàn)過程(附代碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • js仿手機(jī)頁面文件下拉刷新效果

    js仿手機(jī)頁面文件下拉刷新效果

    這篇文章主要為大家詳細(xì)介紹了js仿手機(jī)頁面文件的下拉刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JS實(shí)現(xiàn)圖片局部放大或縮小的方法

    JS實(shí)現(xiàn)圖片局部放大或縮小的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)圖片局部放大或縮小的方法,涉及javascript事件響應(yīng)及頁面元素動(dòng)態(tài)操作相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • bootstrap彈出層的多種觸發(fā)方式

    bootstrap彈出層的多種觸發(fā)方式

    這篇文章主要為大家詳細(xì)介紹了bootstrap彈出層的多種觸發(fā)方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • js數(shù)組相減簡單示例【刪除a數(shù)組所有與b數(shù)組相同元素】

    js數(shù)組相減簡單示例【刪除a數(shù)組所有與b數(shù)組相同元素】

    這篇文章主要介紹了js數(shù)組相減,結(jié)合簡單示例形式分析了JavaScript刪除a數(shù)組所有與b數(shù)組相同元素相關(guān)個(gè)遍歷、判斷、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2020-03-03
  • element-ui 通過按鈕式觸發(fā)日期選擇器

    element-ui 通過按鈕式觸發(fā)日期選擇器

    ElementUI是Vue.js的一套組件庫,其日期時(shí)間選擇器默認(rèn)是通過點(diǎn)擊輸入框來觸發(fā),本文介紹了如何自定義觸發(fā)日期選擇器,同時(shí)隱藏輸入框,通過編寫一個(gè)自定義組件CustomDatePicker.vue,可以實(shí)現(xiàn)點(diǎn)擊按鈕來觸發(fā)日期選擇器
    2024-10-10
  • 實(shí)現(xiàn)非常簡單的js雙向數(shù)據(jù)綁定

    實(shí)現(xiàn)非常簡單的js雙向數(shù)據(jù)綁定

    Angular實(shí)現(xiàn)了雙向綁定機(jī)制。所謂的雙向綁定,無非是從界面的操作能實(shí)時(shí)反映到數(shù)據(jù),數(shù)據(jù)的變更能實(shí)時(shí)展現(xiàn)到界面。本文給大家詳細(xì)介紹js雙向數(shù)據(jù)綁定,感興趣的朋友參考下
    2015-11-11
  • javascript無刷新評(píng)論實(shí)現(xiàn)方法

    javascript無刷新評(píng)論實(shí)現(xiàn)方法

    這篇文章主要介紹了javascript無刷新評(píng)論實(shí)現(xiàn)方法,涉及javascript動(dòng)態(tài)添加表格元素的技巧,需要的朋友可以參考下
    2015-05-05
  • javascript在myeclipse中報(bào)錯(cuò)的解決方法

    javascript在myeclipse中報(bào)錯(cuò)的解決方法

    jqueryjQueryJQUERYJqueryJQueryjquery報(bào)錯(cuò)jsJSJsmyeclipseMyEclipseMyeclipse,很多朋友應(yīng)該都會(huì)遇到過這個(gè)情況吧,按照下面的步驟便可迎刃而解
    2013-10-10

最新評(píng)論

北流市| 文登市| 天津市| 安仁县| 泊头市| 延庆县| 衡东县| 新兴县| 元氏县| 卢氏县| 广灵县| 茂名市| 海晏县| 五原县| 曲沃县| 汕尾市| 兴义市| 孟村| 武川县| 祁连县| 田林县| 太仆寺旗| 永康市| 雷州市| 休宁县| 西乡县| 浠水县| 江西省| 南岸区| 隆安县| 讷河市| 金堂县| 东辽县| 习水县| 仙桃市| 宝丰县| 龙里县| 通州市| 渝北区| 仪陇县| 凤冈县|