UNPKG

force-graph

Version:

2D force-directed graph rendered on HTML5 canvas

41 lines (35 loc) 1.52 kB
<head> <style> body { margin: 0; } </style> <script src="//cdn.jsdelivr.net/npm/force-graph"></script> <!--<script src="../../dist/force-graph.js"></script>--> </head> <body> <div id="graph"></div> <script> fetch('../datasets/miserables.json').then(res => res.json()).then(data => { const Graph = new ForceGraph(document.getElementById('graph')) .graphData(data) .nodeId('id') .nodeAutoColorBy('group') .nodeCanvasObject((node, ctx, globalScale) => { const label = node.id; const fontSize = 12/globalScale; ctx.font = `${fontSize}px Sans-Serif`; const textWidth = ctx.measureText(label).width; const bckgDimensions = [textWidth, fontSize].map(n => n + fontSize * 0.2); // some padding ctx.fillStyle = 'rgba(255, 255, 255, 0.8)'; ctx.fillRect(node.x - bckgDimensions[0] / 2, node.y - bckgDimensions[1] / 2, ...bckgDimensions); ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillStyle = node.color; ctx.fillText(label, node.x, node.y); node.__bckgDimensions = bckgDimensions; // to re-use in nodePointerAreaPaint }) .nodePointerAreaPaint((node, color, ctx) => { ctx.fillStyle = color; const bckgDimensions = node.__bckgDimensions; bckgDimensions && ctx.fillRect(node.x - bckgDimensions[0] / 2, node.y - bckgDimensions[1] / 2, ...bckgDimensions); }); }); </script> </body>