g6/demos/custom-node-pie.html

98 lines
2.5 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="mountNode"></div>
<script src="../build/g6.js"></script>
<script>
/**
* 该实例演示如何使用G6自定义类似饼图的节点
* by 十吾
*
*/
const lightBlue = 'rgb(119, 243, 252)';
const lightOrange = 'rgb(230, 100, 64)';
// 注册自定义名为 pie-node 的节点类型
G6.registerNode('pie-node', {
drawShape: (cfg, group) => {
const radius = cfg.size / 2; // 节点半径
const inPercentage = cfg.inDegree / cfg.degree; // 入度占总度数的比例
const inAngle = inPercentage * Math.PI * 2; // 入度在饼图中的夹角大小
const outAngle = Math.PI * 2 - inAngle; // 出度在饼图中的夹角大小
const inArcEnd = [radius * Math.cos(inAngle), radius * Math.sin(inAngle)]; //入度饼图弧结束位置
let isInBigArc = 1, isOutBigArc = 0;
if (inAngle > Math.PI) {
isInBigArc = 0;
isOutBigArc = 1;
}
// 定义代表入度的扇形形状
const fanIn = group.addShape('path', {
attrs: {
path: [
[ 'M', radius, 0 ],
[ 'A', radius, radius, 0, isInBigArc, 0, inArcEnd[0], inArcEnd[1] ],
[ 'L', 0, 0 ],
[ 'B' ]
],
lineWidth: 0,
fill: lightOrange
}
});
// 定义代表出度的扇形形状
const fanOut = group.addShape('path', {
attrs: {
path: [
[ 'M', inArcEnd[0], inArcEnd[1] ],
[ 'A', radius, radius, 0, isOutBigArc, 0, radius, 0 ],
[ 'L', 0, 0 ],
[ 'B' ]
],
lineWidth: 0,
fill: lightBlue
}
});
// 返回 keyshape
return fanIn;
}
},
"single-shape"
);
const data = {
nodes: [
{
size: 80,
inDegree: 80,
degree: 360,
x: 50,
y: 200
},
{
size: 80,
inDegree: 280,
degree: 360,
x: 200,
y: 200
}
]
}
const graph = new G6.Graph({
container: 'mountNode',
width: 800,
height: 600,
defaultNode: {
shape: 'pie-node'
}
})
graph.data(data)
graph.render()
</script>
</body>
</html>