D3學習:力導向圖佈局
阿新 • • 發佈:2019-01-24
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:滴答滴答,滑鼠觸發事件