使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式:
在当今信息爆炸的时代,如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互式的3D知识图谱。
先看样式:

3D知识图谱演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 项目结构
    项目主要由两个文件组成:
    knowledge-graph.html:HTML文件,定义了页面结构和样式。
    js/knowledge-graph.js:JavaScript文件,包含了3D知识图谱的核心逻辑和交互功能。
  2. HTML结构
    knowledge-graph.html文件定义了基本的HTML结构:
<!DOCTYPE html>
<html lang="zh-CN">
<head><!-- 元数据和样式 -->
</head>
<body><form action="" style="padding: 10px;"><input type="text" name="search" placeholder="输入关键词"><button type="submit">搜索</button></form><div id="graph-container"><div id="3d-graph"></div></div><script src="js/knowledge-graph.js"></script>
</body>
</html>

这个结构包括一个搜索表单和一个用于渲染3D图形的容器。页面使用了深蓝色背景,以增强视觉效果。
3. 数据结构
在knowledge-graph.js中,我们首先定义了知识图谱的数据结构:

const data = {nodes: [{ id: 'node1', name: '算法', group: 1, description: '设计解决问题的步骤和方法' },// ... 其他节点],links: [{ source: 'node1', target: 'node2', relationship: '基础' },// ... 其他链接]
};

;
这个数据结构包含了节点(nodes)和链接(links)。每个节点代表一个知识点,包含id、名称、分组和描述。每个链接定义了节点之间的关系。
4. 创建3D力导向图
使用Force-Graph3D库创建3D力导向图:

const Graph = ForceGraph3D()(graphElement).graphData(data).nodeLabel('name').nodeColor(node => colorMap[node.group]).nodeRelSize(6).linkWidth(1).linkOpacity(0.5).linkDirectionalParticles(2).linkDirectionalParticleSpeed(0.005).backgroundColor('#001f3f').showNavInfo(false).onNodeClick(node => {showNodeDetails(node);// ... 相机定位代码});

;
这段代码设置了图的基本属性,包括节点颜色、大小,链接宽度、不透明度等。同时,我们定义了节点点击事件,用于显示节点详情和调整相机位置。
5. 添加节点和链接标签
为了增加可读性,我们为节点和链接添加了标签:

Graph.nodeThreeObject(node => {const sprite = new SpriteText(node.name);sprite.color = 'white';sprite.textHeight = 8;return sprite;
});Graph.linkLabel(link => link.relationship);

;
节点标签使用SpriteText创建,确保标签始终面向相机。链接标签则直接显示关系描述。
6. 添加图例
为了帮助用户理解不同颜色代表的含义,我们添加了一个图例:

const legend = document.createElement('div');
// ... 设置样式
legend.innerHTML = `<h3>图例</h3><div><span style="color: ${colorMap[1]}">●</span> 基础理论</div>// ... 其他图例项
`;
document.body.appendChild(legend);

;
7. 创建三维坐标系
为了增强3D效果,我们添加了一个三维坐标系:

function createCoordinateSystem(scene, size = 1000) {const axes = new THREE.AxesHelper(size);scene.add(axes);// ... 创建坐标轴标签和网格
}const scene = Graph.scene();
createCoordinateSystem(scene);

;
这个函数创建了X、Y、Z轴以及相应的标签和网格,帮助用户更好地理解3D空间。
8. 实现搜索功能
我们实现了两种搜索功能:实时搜索和精确查询。
实时搜索:

searchInput.addEventListener('input', (e) => {const searchTerm = e.target.value.toLowerCase();Graph.nodeVisibility(node => node.name.toLowerCase().includes(searchTerm));
});

;
精确查询: function searchNode() { const searchTerm = searchInput.value.toLowerCase(); const foundNode = data.nodes.find(node => node.name.toLowerCase() === searchTerm); if (foundNode) { // ... 聚焦到找到的节点 } else { alert('未找到该节点'); } }
}
9. 添加缩放控制
为了方便用户控制视图,我们添加了缩放按钮:

const zoomInButton = createButton('+', () => Graph.zoomToFit(400));
const zoomOutButton = createButton('-', () => Graph.zoomToFit(1000));
  1. 显示节点详情
    当用户点击节点时,我们会显示该节点的详细信息:
function showNodeDetails(node) {const detailsElement = document.getElementById('node-details') || createDetailsElement();detailsElement.innerHTML = `<h3>${node.name}</h3><p>${node.description}</p><p>组别: ${node.group}</p>`;detailsElement.style.display = 'block';
}
  1. 动画循环
    最后,我们设置了一个动画循环,以便在未来添加更多动态效果:
function animate() {requestAnimationFrame(animate);// 如果需要旋转整个场景,可以添加以下代码:// scene.rotation.y += 0.001;
}
animate();

实现了一个功能丰富的3D知识图谱可视化工具。这个工具不仅能够直观地展示知识点之间的关系,还提供了搜索、缩放、节点详情查看等交互功能,大大增强了用户体验。
该项目的核心优势在于:
使用Three.js实现了真正的3D效果,相比2D图表更加直观和沉浸式。
采用力导向图算法,能够自动布局节点,适合展示复杂的知识网络。
提供了丰富的交互功能,如节点点击、搜索、缩放等,方便用户探索知识结构。
通过颜色编码和图例,清晰地区分了不同类别的知识点。
添加了3D坐标系,帮助用户更好地理解空间关系。
未来,我们可以考虑进一步优化这个工具,例如:
添加更多的数据可视化方式,如节点大小表示重要性等。
实现数据的动态加载,以支持更大规模的知识图谱。
添加更多的交互功能,如拖拽节点、展开/折叠子图等。
优化性能,以支持更多节点和链接的流畅渲染。
添加VR支持,提供更加沉浸式的体验。
通过这个项目,我们不仅创造了一个有用的知识可视化工具,还展示了现代Web技术在复杂数据可视化领域的强大能力。这种3D知识图谱可以广泛应用于教育、科研、知识管理等多个领域,帮助人们更好地理解和探索复杂的知识结构。

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

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

相关文章

【深度学习】阿里云GPU服务器免费试用3月

【深度学习】阿里云GPU服务器免费试用3月 1.活动页面2.选择交互式建模PAI-DSW3.开通 PAI 并创建默认工作空间4.前往默认工作空间5.创建交互式建模&#xff08;DSW&#xff09;实例 1.活动页面 阿里云免费使用活动页面 2.选择交互式建模PAI-DSW 支持抵扣PAI-DSW入门机型计算用量…

【计算机网络 - 基础问题】每日 3 题(四十六)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

Git小知识:合理的分支命名约定

前言&#xff1a;创建新分支时&#xff0c;对 Git 分支进行合理的命名非常重要&#xff0c;应选择有描述性的名称&#xff0c;因为它可以帮助团队成员更好地理解分支的目的和内容&#xff0c;以便将来回顾时能立即明白分支的目的。以下是一些常见的分支命名约定&#xff1a; 功…

【Unity新闻】Unity 6 正式版发布

Unity CEO Matt Bromberg 在今天自豪地宣布&#xff0c;Unity 6 正式发布&#xff01;作为迄今为止最强大和稳定的版本&#xff0c;Unity 6 为游戏和应用开发者提供了大量的新功能和工具&#xff0c;帮助他们加速开发并提升性能。 本次正式版是6.0000.0.23f1&#xff08;LTS&a…

spring-boot学习(2)

上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四&#xff0c;五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的&#xff0c;包名 实体类的定义…

在SpringBoot+VUE中 实现登录-RSA的加密解密

步骤-先理清楚在动手 前端首先调用后端的公钥接口,在前端加密密码传输至后端登录接口后端用私钥解密码拿着用户名去数据库查询出来的盐值加密的 密码1用私钥解密密码登录密码加盐值得到 密码2比较密码1与密码2,相同则登录成功&#xff0c;跳转首页&#xff5c;其他页面 前端实…

OpenCV高级图形用户界面(7)获取指定窗口的属性值函数getWindowProperty()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 提供窗口的参数。 函数 getWindowProperty 返回窗口的属性。 cv::getWindowProperty() 函数用于获取指定窗口的属性值。这个函数允许你查询窗口…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…

设置 Notepad++ 制表符(Tab 缩进)宽度为2个空格大小

Notepad 默认的制表符宽度是 4 个空格的大小&#xff0c;一个规模比较大的代码段或者 xml 等文件&#xff0c;小屏幕打开时看到的情景真的和让人着急&#xff0c;拖来拖去&#xff01;有两种方案可以解决这种情况。 修改缩进为空格 这种我们不太推荐&#xff0c;但是有些公司…

小白必看web专题!配置环境还在用phpstudy?该用docker了!(php+nginx+mysql+phpmyadmin。)

大家好&#xff0c;我是Dest1ny。 大家用mac或者是windows都是使用phpstudy。 今天docker来搭建一整个phpnginxmysqlphpmyadmin。 而且mac用docker比较方便&#xff01; docker才是众望所归。 大家多多点赞&#xff0c;多多支持&#xff0c;谢谢&#xff01;&#xff01;&…

Linux 重置 root 密码

如果您在Linux系统中忘记了root密码&#xff0c;可以按照以下步骤重置&#xff1a; 重启系统。在启动时&#xff0c;当GRUB菜单出现时&#xff0c;选择要启动的内核版本&#xff0c;然后按 e 键编辑启动选项。找到以linux或linux16开头的行&#xff0c;它包含了启动内核的命令…

Qml-Item的构造和显示顺序

Qml-Item的构造和显示顺序 qml文件中组件构造顺序 在同一个qml文件中&#xff0c;同层级的Item, 文件尾的Item优先构造&#xff0c;文件首的Item后构造。这就能解释默认情况下同一个qml文件中&#xff0c;几个同层级的item都设置了focus:true&#xff0c;为啥最上面item最终有…

echarts设置x轴中文垂直显示,x轴滚动条

echarts官网配置&#xff0c;主要配置dataZoom option {xAxis: {type: category,data: [张三,李四,王五,赵六,孙七,周八,吴九,郑十,钱十一,陈十二,刘十三,杨十四,黄十五,何十六,宋十七],axisLabel: {formatter: function (value) {return value.split().join(\n); // 使用换行…

超全!一文详解大型语言模型的11种微调方法

导读&#xff1a;大型预训练模型是一种在大规模语料库上预先训练的深度学习模型&#xff0c;它们可以通过在大量无标注数据上进行训练来学习通用语言表示&#xff0c;并在各种下游任务中进行微调和迁移。随着模型参数规模的扩大&#xff0c;微调和推理阶段的资源消耗也在增加。…

pdf内容三张以上转图片,使用spire.pdf.free

一、依赖 <spire.pdf.free.version>9.13.0</spire.pdf.free.version><itextpdf.version>5.5.13</itextpdf.version><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>$…

下载并安装 WordPress 中文版

下载并安装 WordPress 中文版 1. 安装 LAMP 环境(Linux, Apache, MySQL, PHP)1. 安装 Apache2. 安装 MySQL3. 安装 PHP1. 下载并安装 WordPress 中文版1. 下载 WordPress2. 配置文件权限3 . 创建 MySQL 数据库4 . 配置 WordPress1. 安装 LAMP 环境(Linux, Apache, MySQL, PH…

Android Studio简易项目|随机选择器(类似转盘)

一、背景 为了强化对flowlayout流式布局的理解和简易安卓项目架构结构的理解&#xff0c;写一个小项目&#xff0c;随机选择器&#xff0c;控制可见等 二、项目代码 2.1流式布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns…

爬虫实战(黑马论坛)

1.定位爬取位置内容&#xff1a; # -*- coding: utf-8 -*- import requests import time import re# 请求的 URL 和头信息 url https://bbs.itheima.com/forum-425-1.html headers {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like…

【存储设备专栏 2.3 -- 环回设备和块设备区别与联系】

> 请阅读【嵌入式及芯片开发学必备专栏】< 文章目录 环回设备和块设备区环回设备&#xff08;Loop Device&#xff09;定义用途示例 块设备&#xff08;Block Device&#xff09;定义用途示例 区别总结 环回设备和块设备区 在 Linux 系统中&#xff0c;存储设备常通过设…

基于Java实现(PC)大学班级事务管理系统

courseDesign_Java Java 课设 要求 本次设计要求利用 Java 实现 C/S 模式的大学班级内日常事务管理系统&#xff08;PC 版&#xff0c;应用于校内网有线网络访问&#xff0c;暂不开发移动端&#xff09;&#xff0c;不得依赖现有的建模框架&#xff0c;使用 swings 技术完成如…