Highcharts Demo
author(s): Paweł Fus
by Black Label
HTML
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/networkgraph.js"></script>
<div id="container"></div>
CSS
#container {
min-width: 320px;
max-width: 800px;
margin: 0 auto;
height: 500px;
}
JavaScript
(function(H) {
H.wrap(H.seriesTypes.networkgraph.prototype.pointClass.prototype, 'getLinkPath', function(p) {
var left = this.toNode,
right = this.fromNode;
var angle = Math.atan((left.plotX - right.plotX) /
(left.plotY - right.plotY));
if (angle) {
let path = ['M', left.plotX, left.plotY, right.plotX, right.plotY],
lastPoint = left,
nextLastPoint = right,
pointRadius = 45,
arrowLength = 20,
arrowWidth = 10;
if (left.plotY < right.plotY) {
path.push(
nextLastPoint.plotX - pointRadius * Math.sin(angle),
nextLastPoint.plotY - pointRadius * Math.cos(angle),
);
path.push(
nextLastPoint.plotX - pointRadius * Math.sin(angle) - arrowLength * Math.sin(angle) - arrowWidth * Math.cos(angle),
nextLastPoint.plotY - pointRadius * Math.cos(angle) - arrowLength * Math.cos(angle) + arrowWidth * Math.sin(angle),
);
path.push(
nextLastPoint.plotX - pointRadius * Math.sin(angle),
nextLastPoint.plotY - pointRadius * Math.cos(angle),
);
path.push(
nextLastPoint.plotX - pointRadius * Math.sin(angle) - arrowLength * Math.sin(angle) + arrowWidth * Math.cos(angle),
nextLastPoint.plotY - pointRadius * Math.cos(angle) - arrowLength * Math.cos(angle) - arrowWidth * Math.sin(angle),
);
} else {
path.push(
nextLastPoint.plotX + pointRadius * Math.sin(angle),
nextLastPoint.plotY + pointRadius * Math.cos(angle),
);
path.push(
nextLastPoint.plotX + pointRadius * Math.sin(angle) + arrowLength * Math.sin(angle) - arrowWidth * Math.cos(angle),
nextLastPoint.plotY + pointRadius * Math.cos(angle) + arrowLength * Math.cos(angle) + arrowWidth * Math.sin(angle),
);
path.push(
nextLastPoint.plotX + pointRadius * Math.sin(angle),
nextLastPoint.plotY + pointRadius *...