1. 程式人生 > >力導圖——節點平均分佈(通過固定節點座標)

力導圖——節點平均分佈(通過固定節點座標)

力導圖——節點平均分佈(通過固定節點座標)

效果圖

這裡寫圖片描述

需要的工具包:Echarts.js、force.js (可從Echarts的官網下載)

也可以下載完整的demo

步驟

html模組

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>固定節點,子節點平均分佈</title>
    <script src="echarts.js"></script>   
    <!--  這裡的ecarts.js用的是2.2.7版本的,新版本也是可以的 -->
</head> <body> <div id="chart" style="width: 1000px; height: 600px"></div> <!-- 這裡的div塊為圖表佔位符,id必須要--> <script src="relation_graph.js"></script> <!-- 實現力導圖的js--> </body> </html>

demo的中force.js的存放路徑為:dist/chart/force.js

js模組

require.config({
    paths : {
        echarts : 'dist'   //存放Echarts 的路徑  
        //強調,這裡用的Echarts.js是2.2.7版本的,新版本的,可能不行。
    }
});

require([ "echarts", "echarts/chart/force"], 
//echarts/chart/force
function(ec) {
var myChart = ec.init(document.getElementById('chart'), 'macarons');   //chart 為放圖表的div塊的id
var option = { tooltip : { show : false //工具欄,顯示為true }, series : [ { type : 'force', name : "Force tree", draggable:false, //拖動,可拖放 // useWorker:true, steps:1, gravity:0.6, roam:false, itemStyle : { normal : { linkStyle: { type: 'curve', color:'#2aaa90', width:2 } }, emphasis:{ label : {show : true}, nodeStyle : { color:'#f1ab66', borderColor : 'rgba(255,255,255,1)', borderWidth : 3 } } }, categories : [ //第一型別節點的樣式 { name : '0', symbolSize:40, //節點大小 itemStyle:{ normal:{//正常 color:'#24b1b6', borderColor:'#18838b', borderWidth:6, borderWidth : 0, label : { show : true, textStyle:{ fontSize:18 } } }, emphasis:{ //強調,即滑鼠覆蓋或點選時的樣式 borderWidth:6, borderColor:'#fff', label : { show : true, textStyle:{ fontSize:18 } } } } }, //第二型別節點的樣式 { name : '1', symbolSize:20, itemStyle:{ normal:{ color:'#2aaa90', borderWidth : 0, label : { show : true, textStyle:{ fontSize:15 } } }, emphasis:{ borderColor:'#fff', label : { show : true, textStyle:{ fontSize:15 } } } } }, //第三型別節點的樣式 { name : '2', symbolSize:35, itemStyle:{ normal:{ color:'#24b6bc', borderWidth : 0, label : { show : true, textStyle:{ fontSize:18 } } }, emphasis:{ borderWidth:4, borderColor:'#fff', label : { show : true, textStyle:{ fontSize:18 } } } } } ], nodes : [ {id:0,category:0,name:'film',label:'班級',ignore:false,flag:true,initial:[500,300],fixX:true,fixY:true}, {id:1,category:1,name:'role',label:'職位1',ignore:true,flag:true}, {id:2,category:1,name:'role1',label:'職位2',ignore:true,flag:true}, {id:3,category:1,name:'role2',label:'職位3',ignore:true,flag:true}, {id:4,category:1,name:'role3',label:'職位4',ignore:true,flag:true}, {id:5,category:1,name:'role4',label:'職位5',ignore:true,flag:true}, {id:6,category:1,name:'role5',label:'職位6',ignore:true,flag:true}, {id:7,category:2,name:'0',label:'小小',ignore:true,flag:true}, {id:8,category:2,name:'1',label:'小西',ignore:true,flag:true}, {id:9,category:2,name:'2',label:'小利',ignore:true,flag:true}, {id:10,category:2,name:'3',label:'多多',ignore:true,flag:true}, {id:11,category:2,name:'4',label:'德',ignore:true,flag:true}, {id:12,category:2,name:'5',label:'大衛',ignore:true,flag:true}, ], links : [ //順序有要求的 {source : 1,target : 0}, {source : 2,target : 0}, {source : 3,target : 0}, {source : 4,target : 0}, {source : 5,target : 0}, {source : 6,target : 0}, {source : 7,target : 1}, {source : 8,target : 2}, // {source : 9,target : 2}, {source : 9,target : 3}, {source : 10,target : 4}, {source : 11,target : 5}, {source : 12,target : 6}, ] }] }; (function(){ //link 集 var linksSet = option.series[0].links; //節點集 var nodesSet = option.series[0].nodes; //用於存放角色列表 var roleList = []; for(var i=0;i<linksSet.length;i++){ if(linksSet[i].target == 0){ roleList.push(linksSet[i].source); } else continue; } //每一小份的度數 var each = Math.PI*2/roleList.length; //alert(Math.cos(each)); var tx; var ty; for(var i=0;i<roleList.Length;i++){ //雙重迴圈初始化第一層子節點以及第二層子節點的座標 tx = 280 + 67*Math.cos(each*(i+1)); ty = 300 - 67*Math.sin(each*(i+1)); nodesSet[roleList[i]].initial = [tx,ty]; nodesSet[roleList[i]].fixX = true; nodesSet[roleList[i]].fixY = true; for(var j=1;j<linksSet.length;j++){ if(linksSet[j].target == roleList[i]){ var ttx = 280 + 270*Math.cos(each*(i+1)); var tty = 300 - 270*Math.sin(each*(i+1)); nodesSet[linksSet[j].source].initial = [ttx,tty]; //設定座標 //將fixX和fixY設定為true,座標才起作用。 nodesSet[linksSet[j].source].fixX = true; nodesSet[linksSet[j].source].fixY = true; } } } })() myChart.setOption(option); var ecConfig = require('echarts/config'); //當滑鼠點選節點,會展開該節點的延伸 function showNodes(param) { //可在此新增點選事件 var data = param.data; if(data.flag == false){ return false; } var option = myChart.getOption(); var nodesOption = option.series[0].nodes; var linksOption = option.series[0].links; for(var i=1;i<nodesOption.length;i++){ nodesOption[i].ignore = false; } myChart.setOption(option); } myChart.on(ecConfig.EVENT.HOVER,showNodes); });

完整程式碼如上,可下載demo