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

news2024/11/24 7:28:10

文章目录

    • 一、有哪些工具可以生成带链接的网络拓扑图
    • 二、推荐使用D3.js
    • 三、写个 demo吧
    • 四、d3.js相关学习资料
      • 1.官方网站
      • 2.D3.js 教程
      • 3.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/601160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python函数相加:如何使用函数进行数学计算

Python函数相加&#xff1a;如何使用函数进行数学计算 在Python编程中&#xff0c;函数是一种非常有用的工具&#xff0c;可以将代码组织成可重复使用的块。函数可以接受输入并产生输出&#xff0c;也可以执行任何数量的操作。在本文中&#xff0c;我们将介绍如何使用Python函…

美创科技新一代 灾备一体化平台(DRCC v3.0)发布

随着数字化转型浪潮的迅速推进&#xff0c;关键基础设施的运行安全和业务连续性保证成为数字化建设的基石。 云计算时代带来的资产复杂性和灾备技术多态性&#xff0c;给灾备能力建设、灾备资源高效利用和日常灾备运营提出了新挑战。灾备建设如何“简单又弹性”、灾备运营如何“…

Cloudflare 的 Kafka 故事:在处理 1 万亿条消息的过程中吸取的经验教训

关键要点 Cloudflare在处理大量数据时使用Kafka集群&#xff0c;开发了一个通用的消息总线集群&#xff0c;以解耦团队、有效扩展和处理数万亿条消息。 为了解决事件驱动系统中无结构通信的问题&#xff0c;应建立一个强有力的契约&#xff1a;跨平台数据格式Protobuf帮助Cl…

【教程】路由器自动定时登录校园网

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 目录 前景提要 Python脚本 Shell脚本(推荐) 路由器挂机 实现效果 前景提要 小米路由R4A千兆版安装breedOpenWRT教程以及救砖&#xff08;全脚本无需硬改&#xff09;【教程】保姆级红米AX6000刷UBoot和OpenW…

【Shiro】使用org.crazycake依赖的ShiroConfig

前言 整个Shiro专题中&#xff0c;这个部分是最早需要开始看的&#xff0c;主要先了解ShiroConfig都有哪些东西&#xff1b;由于这个项目使用的redis依赖是org.crazycake的shiro-redis&#xff0c;与我后面所用的不同&#xff0c;所以该部分只是简单的梳理了一下。 PS&#xf…

Hadoop高可用集群

HA高可用集群 HA介绍 什么是HA HA: High Availability&#xff0c;高可用集群&#xff0c;指的是集群7*24小时不间断服务。 为什么需要HA 在HDFS中&#xff0c;有NameNode、DataNode和SecondaryNameNode角色的分布&#xff0c;客户端所有的操作都是要与NameNode交互的&#xff…

PG数据库提示: FATAL: sorry, too many clients already

目录 场景&#xff1a; idea启动提示如下错误 翻译&#xff1a; 连接数相关查询&#xff1a; 原因分析&#xff1a; 解决方法&#xff1a; 场景&#xff1a; idea启动提示如下错误 org.postgresql.util.PSQLException: FATAL: sorry, too many clients alreadyat org.pos…

运维小白必学篇之基础篇第四集:vim文本编辑器实验

vim文本编辑器实验 1、创建a.txt文件&#xff0c;并复制到/tmp/file/目录下 2、创建1.txt文件的软链接文件11.txt 3、移动a.txt文件到/mnt目录下并改名为abc.txt 4、创建d1、d2目录&#xff0c;并在d1目录中创建文件a1、a2 5、删除d1目录和d2目录 6、查看/etc/man_db.conf文件的…

DPCNN:深度金字塔 CNN 文本分类网络

DPCNN&#xff08;Deep Pyramid CNN&#xff09;&#xff0c;是2017年腾讯AI-Lab提出的一种用于文本分类的网络&#xff0c;可以称之为"深度金字塔卷积神经网络"。 论文&#xff1a;Deep Pyramid Convolutional Neural Networks for Text Categorization 在之前的博…

运维小白必学篇之基础篇第五集:用户和组实验

用户和组实验 实验者&#xff1a;胡 阳 1、创建u1用户&#xff0c;指定UID为1050&#xff0c;并为该用户设置密码 2、创建u2用户&#xff0c;设置其不能登录操作系统 3、创建u3用户&#xff0c;指定其家目录为/mnt/u3 4、将u1用户改名为s1 5、创建用户u1&#xff0c;指定其UID…

为什么企业都需要一个ERP系统?对公司管理和业务增长都太重要了

什么是ERP系统&#xff1f; ERP&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划&#xff09;系统是一种应用软件&#xff0c;它通过集成管理企业内部系统和外部合作伙伴系统的各种业务过程&#xff0c;来实现企业资源的最优化配置和利用。ERP系统涵盖了企业…

VMware vSphere 8.0 Update 1a 正式版发布 - 企业级工作负载平台

VMware vSphere 8.0 Update 1a 正式版发布 - 企业级工作负载平台 ESXi 8.0 U1 & vCenter Server 8.0 U1 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u1/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sy…

基于java SpringBoot和Vue uniapp的校园信息交流小程序

随着信息社会的网络化和计算机科学的广泛普及和迅速普及应用&#xff0c;具有综合智能的我国校园信息教育网络已成为推动中小学科学教育及其实践科学发展的信息技术手段。迅速推进了信息化改革&#xff0c;改善了高校信息交流的网络环境&#xff0c;提高了信息教育平台的管理水…

利用云服务器搭建云盘(搭建自己的在线存储可上传下载可共享)

Docker部署seafile 背景 由于学校最近有一个需求&#xff0c;搭建一个可供老师使用的在线存储&#xff0c;最后我自己就尝试这搭建。这过程中也出现了不少问题&#xff0c;下面我会说明&#xff01;&#xff01;&#xff01; 准备 需要一台云服务器&#xff08;如果你本地有…

chatgpt赋能python:Python写POC:提高网络安全攻防技能的利器

Python写POC&#xff1a;提高网络安全攻防技能的利器 随着信息化进程的发展&#xff0c;计算机网络的应用越来越广泛&#xff0c;网络安全问题也日益突出。针对网络安全问题的POC&#xff08;Proof Of Concept&#xff0c;概念验证代码&#xff09;作为一种低成本的、快速验证…

chatgpt赋能python:Python冒泡排序法详解

Python冒泡排序法详解 介绍 Python是一种高级编程语言&#xff0c;它设计简洁、易于学习&#xff0c;受到越来越多程序员的欢迎。 在Python编程中&#xff0c;排序算法是非常重要的一部分。其中&#xff0c;冒泡排序法是一种纯粹的比较排序算法&#xff0c;它是大多数排序算…

元宇宙应用领域-运动

元宇宙作为互联网的下一个阶段&#xff0c;目前已经发展成为一个多领域的“平行宇宙”&#xff0c;其中就包括体育。从体育的角度来看&#xff0c;元宇宙将是一个集运动、娱乐、社交、生活、学习于一体的“平行宇宙”&#xff0c;可以让人们在元宇宙中进行更好的运动&#xff0…

ChatGPT下的网站建设会收到哪些影响?

近日&#xff0c;微软发布了人工智能语言模型 ChatGPT&#xff0c;该模型可以理解人类的语言并生成响应式文本。与其他自然语言处理模型不同&#xff0c; ChatGPT具有出色的语言理解能力&#xff0c;并能够生成自然、流畅的文本。 ChatGPT不仅能够回答用户问题&#xff0c;还能…

有关计算机科学与技术论文

有关计算机科学与技术论文篇一 《 计算方法在计算机科学与技术专业教学改革与实践 》 摘要&#xff1a;介绍了对计算机科学与技术专业的计算方法课程教学改革进行的尝试和探索&#xff0c;结合该专业提出了计算方法课程教学改革的几个重点及策略&#xff0c;优化了教学内容、…

CUDA编程中的HANDLE_ERROR( )和book.h-2023

最近个人正在学习cuda编程&#xff0c;这个帖子作为一个经验记录。 第一呢&#xff0c;这本书里面很明显面对的是一些有编程基础的同学准备的&#xff0c;因此他很多细节都是跳过&#xff0c;这就给我们一些初学者带来了困扰。 个人读下来&#xff0c;建议这个文章可以作为参…