力導圖——節點平均分佈(通過固定節點座標)
阿新 • • 發佈:2018-11-29
力導圖——節點平均分佈(通過固定節點座標)
效果圖
需要的工具包: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);
});