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

news2024/10/21 22:30:07

先看样式:
在当今信息爆炸的时代,如何有效地组织和展示复杂的知识结构成为一个重要的挑战。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.coloradmin.cn/o/2220331.html

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

相关文章

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

解决:YOLOv8训练数据集时P、R、mAP等值均为0的问题

文章目录 问题解决1.匹配pytorch与cuda的版本2.使用 Adam 优化器3.加大训练轮数epoch4. 删除data/labels下的train.cache和val.cache 问题 使用YOLOv8训练自己的数据集时&#xff0c;出现P、R、mAP等值均为0的问题 Model summary (fused): 186 layers, 2,685,733 parameters, …

【 Git 】git push 出现报错 fatal: Could not read from remote repository.

git push 出现报错 fatal: Could not read from remote repository. 问题描述解决方案 问题描述 Connection closed by 198.18.0.xx port xx fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解…

【JavaScript】Javascript基础Day04:函数

Javascript——Day04 01. 函数的基本使用02. 函数的参数以及默认参数03. 匿名函数之函数表达式04. 逻辑中断05. 转换为布尔型 01. 函数的基本使用 02. 函数的参数以及默认参数 注意&#xff1a; 03. 匿名函数之函数表达式 函数&#xff1a;匿名函数/具名函数 为什么这个外部…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时&#xff0c;从后端获取数据需要用到 Authorization 授权的Bearer令牌&#xff0c;而这个令牌的获取需要登录后台进行获取&#xff0c;这里登录时还涉及到的验证码的操作&#xff0c;所以在获取过程中&#xff0c;需要对后台系统进行登录并拿到这个Be…

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量&#xff1a; index&#xff1a;含义&#xff1a;它表示 Series 对象的索引&#xff0c;也就是每个数据点对…

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐) 本期是平台君和您分享的第89期内容 2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。 起诉书(来源:RPX网站) 看到这则新闻…

面试官:并发时,故意不加锁会怎么样?

感谢Java面试教程关于并发锁的面试分享 在并发编程中&#xff0c;如果不加锁&#xff0c;可能会导致以下问题&#xff1a; 数据不一致&#xff1a;多个线程同时访问和修改共享资源时&#xff0c;如果没有加锁&#xff0c;可能会导致数据竞争&#xff0c;即一个线程在读取数据…

Maven入门到进阶:构建、依赖与插件管理详解

文章目录 一、Maven介绍1、什么是Maven2、Maven的核心功能 二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成 1.4、Packaging 2、POM、父POM和超级POM2.1、POM (Project Object Model)2.1、父POM&#xff08;Parent POM&#xff09;2.…

算法的学习笔记—丑数(牛客JZ49)

&#x1f600;前言 在程序设计和算法竞赛中&#xff0c;丑数问题是一个经典的动态规划题目。丑数&#xff08;Ugly Number&#xff09;定义为只包含质因子 2、3 和 5 的数。举例来说&#xff0c;数字 6&#xff08;因子为 2 和 3&#xff09;、数字 8&#xff08;因子为 2&…

gewechat免费开源微信机器人开发

​聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题&#xff0c;以实现降低企业客服运营成本、提升…

珊瑚岛风灵月影四十九项修改器:体力不减/生命不减/开启金钱修改

珊瑚岛是一款以模拟经营岛屿为特色的休闲养成游戏。在游戏中&#xff0c;玩家需设法吸引顾客消费。同时&#xff0c;还需投入时间和资源修复遗址&#xff0c;过程中或会遇到技术、资金及文化保护等挑战&#xff0c;增添游戏趣味与深度。 修改器地址&#xff1a; https://downf…

力扣——链表的中间结点(链表)C语言

题目&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 返回中间3这个结点&#xff1b; 返回中4这个结点&#xff1b; 原理&#xff1a; 思路1&#xff1a;利用遍历链表&#xff0c;统…

图文深入理解java的内存分配

本篇图文深入讨论java的内存分配。当然&#xff0c;这里所说的深入&#xff0c;并不是指长篇大论&#xff0c;而是就事论事重点深入介绍java的内存分配原理机制。 在理解java如何为变量或者对象分配内存之前&#xff0c;我们先来了解一个问题&#xff1a;为什么需要分配内存&am…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑&#xff0c;如何跳过联网激活&#xff1b;由于微软限制必须要联网激活&#xff0c;需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用&#xff0c;Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

今年双十一最值得入手的好物有哪些?双十一值得选购的好物盘点!

在这个全民狂欢的购物盛宴——双十一&#xff0c;每一个角落都弥漫着诱人的优惠与不可错过的精品。从科技潮品到生活必需品&#xff0c;从时尚尖货到家居好物&#xff0c;无数精选商品在这一季集中绽放&#xff0c;等待着慧眼识珠的你将它们带回家&#xff0c;今年的双十一&…

除GOF23种设计模式之简单工厂模式

文章目录 1. 简介2. 代码2.1 抽象类&#xff1a;Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂:CourseFactory.java2.5 测试&#xff1a;Test.java 3. 心得参考链接&#xff08;无&#xff09; 1. 简介 简单工厂模式(Simple Factory Patern):又称…

Java项目-基于springboot框架的网上书城系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

【番外】软件设计师中级笔记关于数据库技术更新笔记问题

提问 由于软件设计师中级笔记中第九章数据库技术基础的笔记内容太多&#xff0c;我应该分几期发布呢&#xff1f;还是一期一次性发布完成。 如果分为一期发布&#xff0c;可能需要给我多一些时间&#xff0c;由于markdown格式有所差异&#xff0c;所以我需要部分进行修改与调…

策略路由---选路

目录 拓扑图 配置IP 配置静态路由 配置ospf nat 配置路由策略 流分类 流行为 流策略 应用接口 测试流量路径 拓扑图 配置IP [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [R1-GigabitEthernet0/0/0]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add…