1. 程式人生 > >D3學習:力導向圖佈局

D3學習:力導向圖佈局

var nodes = [{name:"盤錦"}, {name:"北票"}, {name:"錦州"}, {name:"瀋陽"}, {name:"大連"}, {name:"廈門"}, {name:"北京"}]; var edges = [{source:0,target:1}, {source:0
,target:2}, {source:0,target:3}, {source:1,target:4}, {source:1,target:5}, {source:1,target:6}]; var width = 400, height = 400; var svg = d3.select("body") .append("svg") .attr("width"
, width) .attr("height", height); var force = d3.layout.force() .nodes(nodes) .links(edges) .size([width,height]) .linkDistance(150)//指定連線長度 .charge([-300]);//指定相互之間的作用力
//負電荷數 //上面的語句定義了力佈局方式 //並用力佈局的方式使得原始資料變成了畫力導向圖 //所需要的資料格式 force.start();//開始作用力 console.log(nodes); console.log(edges); //看控制檯輸出的資料,已經發生了變化 var color = d3.scale.category20(); //新增節點 var svg_nodes = svg.selectAll("circle") .data(nodes) .enter() .append("circle") .attr("r", 20) .attr("fill", function (d, i) {return color(i);}) .call(force.drag); //call使得節點能夠被拖拽 //新增連線 var svg_edges = svg.selectAll("line") .data(edges) .enter() .append("line") .attr("stroke","#ccc") .attr("stroke-width",1); //新增文字 var svg_texts = svg.selectAll("text") .data(nodes) .enter() .append("text") .attr("fill","orange") .attr("dx", 20) .attr("dy", 8) .text(function (d) {return d.name;}); //第一次敲到這兒的時候,我開啟網頁看了一下效果 //本以為會有靜態的圖,結果是所有東西都聚在了左上角 //想想可能是因為上面只是添加了一些元素 //指定了一些相對位置以及確定的量 //但是具體的元素座標等還是沒有說明 //所以需要下面這一段程式碼 force.on("tick", function () { svg_edges.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;}); svg_nodes.attr("cx", function (d) {return d.x;}) .attr("cy", function (d) {return d.y;}); svg_texts.attr("x", function (d) {return d.x;}) .attr("y", function (d) {return d.y;}); }) //tick:滴答滴答,滑鼠觸發事件