【工具推荐】使用D3.js制作网页版网络拓扑图,可拖转可跳转链接

一、有哪些工具可以生成带链接的网络拓扑图

有一些 JavaScript 库可以帮助你创建网络拓扑图,并且支持将每个节点作为超链接。

以下是一些我推荐的库:

  1. D3.js:D3 是一个非常强大的 JavaScript 库,用于创建数据驱动的文档。你可以使用它来创建复杂的网络拓扑图,并且可以轻松地将每个节点作为超链接。
  2. Cytoscape.js:Cytoscape.js 是一个开源的图形理论库,允许你在网页上可视化复杂网络。它支持多种图形布局,并且可以将节点作为超链接。
  3. Vis.js:Vis.js 是一个动态、基于浏览器的可视化库。它的网络模块可以用于创建网络拓扑图,并且支持将节点作为超链接。
  4. Sigma.js:Sigma 是一个专注于图形绘制的 JavaScript 库,它使得在网页或者图形上展示网络变得简单。你可以将每个节点作为超链接。
  5. GoJS:GoJS 是一个用于构建交互式图表和图形的 JavaScript 库,包括网络拓扑图。你可以轻松地将每个节点作为超链接。

二、推荐使用D3.js

为什么我推荐使用D3.js呢?因为一个库比较看重的是它在开源项目中的数据,毕竟使用的人越多,它的功能就会越有动力做优化。

D3.js 是一个 JavaScript 库,用于基于数据操作文档。D3 可帮助您使用 HTML、SVG 和 CSS 使数据栩栩如生。D3 对 Web 标准的强调为您提供了现代浏览器的全部功能,而无需将自己绑定到专有框架,将强大的可视化组件和数据驱动的 DOM 操作方法相结合。

D3 允许您将任意数据绑定到文档对象模型 (DOM),然后将数据驱动的转换应用于文档。例如,可以使用 D3 从数字数组生成 HTML 表。或者,使用相同的数据创建具有平滑过渡和交互的交互式 SVG 条形图。

D3 不是一个寻求提供所有可能功能的整体框架。相反,D3 解决了问题的症结:基于数据高效操作文档。这避免了专有表示,并提供了非凡的灵活性,公开了 HTML、SVG 和 CSS 等 Web 标准的全部功能。D3 开销最小,速度极快,支持大型数据集以及交互和动画的动态行为。D3 的函数式风格允许通过各种官方和社区开发的模块重用代码。

根据 npm trends 的数据,以下是这些库的使用情况:

  • D3.js:每周下载次数约为 2,061,216 次,GitHub 上的星星数量为 105,494。
  • Cytoscape.js:每周下载次数约为 247,239 次,GitHub 上的星星数量为 9,126。
  • GoJS:每周下载次数约为 39,263 次,GitHub 上的星星数量为 6,908。
  • Sigma.js:每周下载次数约为 7,278 次,GitHub 上的星星数量未知。
  • Vis.js:每周下载次数约为 24 次,GitHub 上的星星数量为 2。

从这些数据来看,D3.js 是使用人数最多的库,其次是 Cytoscape.js 和 GoJS。Sigma.js 和 Vis.js 的使用人数相对较少。

image-20230602110759038

三、写个 demo吧

我使用D3.js写了一个 demo,实现了基本都节点连接和超链接功能,源码如下。

<!DOCTYPE html>
<html>
<head>
    <title>D3.js Network Topology Demo</title>
    <script src="https://d3js.org/d3.v7.min.js"></script>
</head>
<body>
    <script>
        // 创建 SVG 元素
        var svg = d3.select("body")
                    .append("svg")
                    .attr("width", 800)
                    .attr("height", 600);

        // 定义节点和链接的数据
        var nodes = [
            {id: "Router", url: "https://www.example1.com"},
            {id: "Switch", url: "https://www.example2.com"},
            {id: "Host 1", url: "https://www.example3.com"},
            {id: "Host 2", url: "https://www.example4.com"},
            {id: "Host 3", url: "https://www.example5.com"}
        ];

        var links = [
            {source: nodes[0], target: nodes[1]},
            {source: nodes[1], target: nodes[2]},
            {source: nodes[1], target: nodes[3]},
            {source: nodes[1], target: nodes[4]}
        ];

        // 创建力导向图
        var simulation = d3.forceSimulation(nodes)
                           .force("link", d3.forceLink(links).distance(200))
                           .force("charge", d3.forceManyBody().strength(-400))
                           .force("center", d3.forceCenter(400, 300));

        // 创建链接
        var link = svg.append("g")
                      .selectAll("line")
                      .data(links)
                      .join("line")
                      .attr("stroke", "#999")
                      .attr("stroke-opacity", 0.6);

        // 创建节点
        var node = svg.append("g")
                      .selectAll("a")
                      .data(nodes)
                      .join("a")
                      .attr("xlink:href", d => d.url)
                      .attr("target", "_blank")
                      .call(drag(simulation));

        node.append("circle")
            .attr("r", 20)
            .attr("fill", "#69b3a2");

        node.append("text")
            .attr("dy", "0.35em")
            .attr("x", 25)
            .text(d => d.id);

        // 更新力导向图
        simulation.on("tick", () => {
            link.attr("x1", d => d.source.x)
                .attr("y1", d => d.source.y)
                .attr("x2", d => d.target.x)
                .attr("y2", d => d.target.y);

            node.attr("transform", d => `translate(${d.x},${d.y})`);
        });

        // 定义拖拽行为
        function drag(simulation) {
            function dragstarted(event) {
                if (!event.active) simulation.alphaTarget(0.3).restart();
                event.subject.fx = event.subject.x;
                event.subject.fy = event.subject.y;
            }

            function dragged(event) {
                event.subject.fx = event.x;
                event.subject.fy = event.y;
            }

            function dragended(event) {
                if (!event.active) simulation.alphaTarget(0);
                event.subject.fx = null;
                event.subjectfy = null;
            }

            return d3.drag()
                     .on("start", dragstarted)
                     .on("drag", dragged)
                     .on("end", dragended);
        }
    </script>
</body>
</html>

实际运行结果如下。

image-20230602110948505

四、d3.js相关学习资料

1.官方网站

https://d3js.org/

image-20230602111121439

2.D3.js 教程

https://www.tutorialsteacher.com/d3js

image-20230602111545015

3.D3.js 教程

https://www.tutorialspoint.com/d3js/index.htm

image-20230602111720085

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
使用D3.js绘制拓扑图,可以按以下步骤进行操作: 1. 定义数据结构:拓扑图通常由节点和边组成,需要定义节点和边的数据结构。 2. 创建SVG容器:使用D3.js创建SVG容器,设置宽度和高度。 3. 绘制节点:使用D3.js绘制节点,可以根据节点的属性设置节点的大小、形状、颜色等。 4. 绘制边:使用D3.js绘制边,可以根据边的属性设置边的粗细、颜色等。 5. 添加交互:可以为节点和边添加交互效果,例如鼠标悬停、点击等。 以下是一个简单的示例代码: ```javascript // 定义数据结构 var nodes = [{id: 1, name: 'Node 1'}, {id: 2, name: 'Node 2'}, {id: 3, name: 'Node 3'}]; var links = [{source: 1, target: 2}, {source: 2, target: 3}, {source: 3, target: 1}]; // 创建SVG容器 var svg = d3.select('body').append('svg') .attr('width', 400) .attr('height', 400); // 绘制节点 var node = svg.selectAll('.node') .data(nodes) .enter().append('circle') .attr('class', 'node') .attr('r', 20) .attr('cx', function(d) { return Math.random() * 400; }) .attr('cy', function(d) { return Math.random() * 400; }) .style('fill', 'blue'); // 绘制边 var link = svg.selectAll('.link') .data(links) .enter().append('line') .attr('class', 'link') .attr('x1', function(d) { return node.filter(function(n) { return n.id === d.source; }).attr('cx'); }) .attr('y1', function(d) { return node.filter(function(n) { return n.id === d.source; }).attr('cy'); }) .attr('x2', function(d) { return node.filter(function(n) { return n.id === d.target; }).attr('cx'); }) .attr('y2', function(d) { return node.filter(function(n) { return n.id === d.target; }).attr('cy'); }) .style('stroke', 'black') .style('stroke-width', 2); // 添加交互 node.on('mouseover', function() { d3.select(this).style('fill', 'red'); }).on('mouseout', function() { d3.select(this).style('fill', 'blue'); }); ``` 这段代码创建了一个包含3个节点和3条边的拓扑图,节点和边的位置是随机生成的。运行代码后,可以看到一个简单的拓扑图,并且当鼠标悬停在节点上时,节点的颜色会变为红色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雨青年

程序员可以把咖啡转化成代码~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值