使用D3js繪制Force-Directed Graph(力導(dǎo)向圖)

2021-6-7    前端達(dá)人

Force-directed(力導(dǎo)向)圖形繪制算法通過(guò)圖形本身的結(jié)構(gòu)(圖中頂點(diǎn)與邊的拓?fù)潢P(guān)系)計(jì)算出圖形的層次,而不依賴(lài)于特定領(lǐng)域的知識(shí)。使用力導(dǎo)向算法繪制的平面圖形通常比較美觀,并且圖中各條邊之間的交叉盡可能的少。

本文對(duì)使用D3js繪制Foorce-Directed Graph(力導(dǎo)向圖)的過(guò)程進(jìn)行簡(jiǎn)要的介紹,以下面的邏輯圖(包含6個(gè)節(jié)點(diǎn)和5條邊)為例。

import json #nodes為圖的節(jié)點(diǎn)集合 nodes = [{'name' : 'nodeA'}, 
         {'name' : 'nodeB'}, 
         {'name' : 'nodeC'}, 
         {'name' : 'nodeD'}, 
         {'name' : 'nodeE'}, 
         {'name' : 'nodeF'}] #links為圖的邊集合,source為起點(diǎn),target為終點(diǎn) links = [{'source' : 0 , 'target' : 1}, 
         {'source' : 0 , 'target' : 2}, 
         {'source' : 0 , 'target' : 3}, 
         {'source' : 0 , 'target' : 4}, 
         {'source' : 0 , 'target' : 5}] #graph為邏輯圖,由節(jié)點(diǎn)集合和邊集合組成 graph = {'nodes' : nodes , 'links' : links} print json.dumps(graph) 

上例的源碼 force-directed-graph.html 及注釋如下:

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <style> .link { stroke : #CCC; stroke-width : 2; } .node text { pointer-events : none; font-size : 12px; } svg { overflow : hidden; } </style> <script src="http://libs.useso.com/js/jquery/1.11.1/jquery.min.js"></script> <script src="http://libs.useso.com/js/d3/3.4.8/d3.min.js"></script> <script> var graph = {"nodes": [{"name": "nodeA"}, 
{"name": "nodeB"}, 
{"name": "nodeC"}, 
{"name": "nodeD"}, 
{"name": "nodeE"}, 
{"name": "nodeF"}], "links": [{"source": 0, "target":1}, 
{"source": 0, "target": 2}, 
{"source": 0, "target": 3}, 
{"source": 0, "target": 4}, 
{"source": 0, "target": 5}]}; //返回隨機(jī)顏色代碼 function random_color() { var letters = '0123456789ABCDEF'.split(''); var color = '#'; for (var i = 0; i < 6; i++ ) {
        color += letters[Math.round(Math.random() * 15)];
    } return color;
} function draw() { var width = 400; var height = 300; //設(shè)置svg寬度和高度 var svg = d3.select("#canvas svg")
    .attr("width", width)
    .attr("height", height); //設(shè)置Force-Directed力參數(shù) var force = d3.layout.force()
    .gravity(.05)
    .distance(120)
    .charge(-100)
    .size([width, height]);
  force
    .nodes(graph.nodes)
    .links(graph.links)
    .start(); //選擇邊集合 var link = svg.selectAll(".link")
    .data(graph.links)
    .enter().append("line")
    .attr("class", "link"); //選擇節(jié)點(diǎn)集合 var node = svg.selectAll(".node")
    .data(graph.nodes)
    .enter().append("g")
    .attr("class", "node")
    .call(force.drag); //響應(yīng)鼠標(biāo)拖拽事件 //節(jié)點(diǎn)添加圓形圖案 node.append("svg:circle").attr("r", 10)
    .style("fill", function(){ return random_color();
    })
    .style("stroke", "#FFF").style("stroke-width", 3);
    node.append("text")
      .attr("dx", 12)
      .attr("dy", ".36em")
      .text(function(d) { return d.name }); //綁定tick事件 force.on("tick", function() { 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; });
    node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
  });
}
$(function(){ draw();
}); </script> </head> <body> <div id="canvas"> <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="300"></svg> </div> </body> </html> 

 

本文鏈接:http://bookshadow.com/weblog/2014/11/04/d3js-force-directed-graph/
請(qǐng)尊重作者的勞動(dòng)成果,轉(zhuǎn)載請(qǐng)注明出處!書(shū)影博客保留對(duì)文章的所有權(quán)利。



藍(lán)藍(lán)設(shè)計(jì)建立了UI設(shè)計(jì)分享群,每天會(huì)分享國(guó)內(nèi)外的一些優(yōu)秀設(shè)計(jì),如果有興趣的話(huà),可以進(jìn)入一起成長(zhǎng)學(xué)習(xí),請(qǐng)掃碼藍(lán)小助,報(bào)下信息,藍(lán)小助會(huì)請(qǐng)您入群。歡迎您加入噢~~希望得到建議咨詢(xún)、商務(wù)合作,也請(qǐng)與我們聯(lián)系。

截屏2021-05-13 上午11.41.03.png

  藍(lán)藍(lán)設(shè)計(jì)www.bouu.cn )是一家專(zhuān)注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶(hù)體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)


分享本文至:

日歷

鏈接

個(gè)人資料

存檔