一个展示各子系统之间数据流向的图
配置项如下
//浏览器resize重画
function resizeChart() {
var w = $('body').width();
var h = $('body').height();
myChart.resize({
width: w,
height: h
});
option.series = getSeries();
myChart.setOption(option, true);
}
var data = [{
name: '节点1',
code: 'node1',
value: {
interfaceNum: 0,
kpiNum: 0,
alarmNum: 0
},
x: 0.1,
y: 0.65
}, {
name: '节点2',
code: 'node2',
value: {
interfaceNum: 0,
kpiNum: 0,
alarmNum: 0
},
x: 0.3,
y: 0.8
}, {
name: '节点3',
code: 'node3',
value: {
interfaceNum: 0,
kpiNum: 0,
alarmNum: 0
},
x: 0.3,
y: 0.5
}, {
name: '节点4',
code: 'node4',
value: {
interfaceNum: 0,
kpiNum: 0,
alarmNum: 0
},
x: 0.5,
y: 0.5
}];
var links = [{
source: 'node1',
target: 'node2',
}, {
source: 'node1',
target: 'node3',
}, {
source: 'node3',
target: 'node4',
}];
var line = 3; //行:把画布上画几行信息框
var column = 4; //列:把画布上画几列信息框
function getScatterData() {
var scatterData = [];
//画布宽高
var c_w = myChart.getWidth();
var c_h = myChart.getHeight();
//计算信息框的宽高
var w = c_w / (column * 2);
var h = c_h / (line * 2);
for (var i = 0; i < data.length; i++) {
//把消息框分为两部分:标题和内容,内容高度为标题高度的3倍,echart是以中心画图,所以要分别计算标题和内容框的中心点位置
scatterData.push({
name: data[i].name,
value: [data[i].x, (data[i].y * c_h + (3 / 8 * h)) / c_h],
type: 'title',
w: w,
h: h / 4,
label: {
normal: {
textStyle: {
color: '#fff',
fontWeight: 'bold',
fontSize: 15
}
}
}
}, {
code: data[i].code,
value: [data[i].x, (data[i].y * c_h + (1 / 4 * h) - (3 / 4 * h) / 2) / c_h],
type: 'body',
w: w,
h: 3 / 4 * h,
info: data[i].value,
label: {
normal: {
textStyle: {
color: '#000'
}
}
}
});
}
return scatterData;
}
function getLinesData() {
var linesData = [];
var map = {};
for (var i = 0; i < data.length; i++) {
map[data[i].code] = data[i];
}
for (var i = 0; i < links.length; i++) {
var source = map[links[i].source];
var target = map[links[i].target];
//画布宽高
var c_w = myChart.getWidth();
var c_h = myChart.getHeight();
//计算信息框的宽高
var w = c_w / (column * 2);
var h = c_h / (line * 2);
//计算信息框的四个边中点的位置
source.top = {
x: source.x,
y: (source.y * c_h + (1 / 2 * h)) / c_h
};
source.right = {
x: (source.x * c_w + (1 / 2 * w)) / c_w,
y: source.y
};
source.bottom = {
x: source.x,
y: (source.y * c_h - (1 / 2 * h)) / c_h
};
source.left = {
x: (source.x * c_w - (1 / 2 * w)) / c_w,
y: source.y
};
target.top = {
x: target.x,
y: (target.y * c_h + (1 / 2 * h)) / c_h
};
target.right = {
x: (target.x * c_w + (1 / 2 * w)) / c_w,
y: target.y
};
target.bottom = {
x: target.x,
y: (target.y * c_h - (1 / 2 * h)) / c_h
};
target.left = {
x: (target.x * c_w - (1 / 2 * w)) / c_w,
y: target.y
};
//s->t:s左:t右
if (source.right.x < target.left.x) {
linesData.push(getLine([
[source.right.x, source.right.y],
[target.left.x, target.left.y]
]));
}
//t<-s:s右:t左
else if (source.left.x > target.right.x) {
linesData.push(getLine([
[source.left.x, source.left.y],
[target.right.x, target.right.y]
]));
}
//s
//|
//t
else if (source.bottom.y > target.top.y) {
linesData.push(getLine([
[source.bottom.x, source.bottom.y],
[target.top.x, target.top.y]
]));
}
//t
//|
//s
else if (source.top.y < target.bottom.y) {
linesData.push(getLine([
[source.top.x, source.top.y],
[target.bottom.x, target.bottom.y]
]));
}
}
return linesData;
}
function getLine(coords) {
return {
name: '',
type: 'lines',
coordinateSystem: 'cartesian2d',
symbol: ['none', 'arrow'],
symbolSize: 10,
zlevel: 4,
effect: {
show: true,
period: 6,
trailLength: 0.7,
color: '#7480BC',
symbolSize: 3
},
lineStyle: {
normal: {
color: '#9EADD6',
width: 1,
curveness: 0
}
},
data: [{
coords: coords
}]
};
}
function getSeries() {
var series = [];
series.push({
type: 'scatter',
symbol: 'rect',
zlevel: 2,
silent: true,
symbolSize: function(value, params) {
return [params.data.w, params.data.h];
},
itemStyle: {
normal: {
shadowBlur: 10,
shadowColor: 'rgba(120, 36, 50, 0.5)',
shadowOffsetY: 5,
color: function(params) {
if (params.data.type == 'title') {
return '#007CB8';
} else {
return '#6DC6F2';
}
}
}
},
label: {
normal: {
show: true,
position: 'inside',
formatter: function(params) {
if (params.data.type == 'title') {
return params.data.name;
} else {
return '核心接口数量:' + params.data.info.interfaceNum +
'\n监测指标数量:' + params.data.info.kpiNum +
'\n告警数量' + params.data.info.alarmNum;
}
},
textStyle: {
color: '#000'
}
}
},
data: getScatterData(),
});
return series.concat(getLinesData());
}
option = null;
option = {
backgroundColor: '#F3F3F3',
title: [{
text: "流程图",
x: '5%',
y: 0,
textStyle: {
color: '#333',
fontStyle: 'normal',
fontWeight: 'normal',
fontFamily: 'sans-serif',
fontSize: 14,
}
}],
tooltip: {
/*trigger: 'axis',
axisPointer: {
show: true,
type: 'cross'
}*/
},
grid: {
left: 0,
right: 0,
top: 0,
bottom: 0
},
xAxis: {
type: 'value',
splitLine: {
show: false,
},
axisLabel: {
show: false
},
max: 1,
min: 0
},
yAxis: {
type: 'value',
splitLine: {
show: false,
},
axisLabel: {
show: false
},
max: 1,
min: 0
},
series: getSeries()
};