使用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知识图谱可以广泛应用于教育、科研、知识管理等多个领域,帮助人们更好地理解和探索复杂的知识结构。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【电商购物管理系统】Python+Django网页界面平台+商品管理+数据库

一、介绍 电商购物管理系统&#xff0c;本系统前端使用HTML、CSS、BootStrap等技术搭建前端界面&#xff0c;后端使用Django框架处理用户的逻辑请求。主要功能有&#xff1a; 管理员登录与管理&#xff1a;管理员可以登录后台&#xff0c;对用户和商品进行增删改查的操作。用…

stm32 bootloader写法

bootloader写法&#xff1a; 假设app的起始地址&#xff1a;0x08020000&#xff0c;则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义 typedef void (*APP_FUNC)(void); // 函数指针类型定义 /*main函数中调用rum_app&#x…

vue + 百度地图GL版判断一个点位是否在地图可视区内

利用BMapGLLib中isPointInRect 因为没有找到官方文档因此直接下载了该工具的源码&#xff0c;复制以下部分到自己的项目中&#xff0c;避免再次引用完整的BMapGLLib脚本 关键方法 isPointInRect(point, bounds) {if (!(point.toString() "Point" || point.toString(…

解锁机器人视觉与人工智能的潜力,从“盲人机器”改造成有视觉能力的机器人(下)

机器视觉产业链全景回顾 视觉引导机器人生态系统或产业链分为三个层次。 上游&#xff08;供应商&#xff09; 该机器人视觉系统的上游包括使其得以运行的硬件和软件提供商。硬件提供商提供工业相机、图像采集卡、图像处理器、光源设备&#xff08;LED&#xff09;、镜头、光…

英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞复现

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communication System,它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络…

93、Python之异常:了解常见的内置异常,遇到不慌

引言 本文接着来聊Python中的异常管理&#xff0c;对于新手来说&#xff0c;一旦看到异常&#xff0c;就会比较慌张。其实&#xff0c;倒不是对异常比较害怕&#xff0c;而是担心不知道该怎么处理这种异常才是比较可怕的。本文就简单列举一下Python中比较常见的异常&#xff0…

python学习-怎么在Pycharm写代码

打开Pycharm&#xff0c;点击文件-新建项目 2.选择pure python-点击箭头 展开 3.选择 Existing interpreter 如果 Existing interpreter 下没有相关环境 &#xff08;1&#xff09;点击**…** &#xff08;2&#xff09;选择python的安装路径 4.可修改文件名称-点击创建 …

二叉搜索树中第 K 小的元素

二叉搜索树中第 K 小的元素 ​ 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1…

QT实现改变窗口大小其子控件也自动调节大小

创建一个顶层布局即可&#xff0c;一定要在MainWindows或者Widget的下面&#xff01; 观察图标变化 带有禁止的意思是分拆布局&#xff08;当前无布局&#xff09; 现在是添加布局后了 注意&#xff1a;一定是在MainWindows或Widget才可以添加顶层布局&#xff0c;才可以实现…

Golang简介

目录 第一章 go语言起源 第一节 go语言发展 1.知名编程语言或系统的发展简吏 2.Go语言的前世今生 3.go语言的核心特性 4.Go语言的优势和其他语言的对比 5.Go开发环境搭建 第二章 go语言Helloworld 一、go项目工程结构 二、执行go程序 三、go程序的解释说明 第三章 g…

29.第二阶段x86游戏实战2-遍历周围-花指令与二叉树数据结构(有如何阅读vm代码混淆代码)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

VmWare下的linux虚拟机磁盘空间扩展

我用vmware开启了一个虚拟机&#xff0c;虚拟机操作系统是centos7。今天发现磁盘空间不够了&#xff0c;导数据到里面的mysql&#xff0c;提示没有空间&#xff0c;之后mysql也连不上了。这个mysql部署在docker里&#xff0c;结果停止都停止不了&#xff0c;强制停止也不行。无…

10-Python基础编程之函数

Python基础编程之函数 概念基本使用参数单个参数多个参数不定长参数缺省参数注意事项 返回值使用描述偏函数高阶函数返回函数匿名函数闭包装饰器生成器递归函数函数的作用域 概念 写了一段代码实现了某个小功能&#xff1a;然后把这些代码集中到一块&#xff0c;起一个名字&am…

五、Spring Boot集成Spring Security之认证流程2

一、Spring Boot集成Spring Security专栏 一、Spring Boot集成Spring Security之自动装配 二、Spring Boot集成Spring Security之实现原理 三、Spring Boot集成Spring Security之过滤器链详解 四、Spring Boot集成Spring Security之认证流程 五、Spring Boot集成Spring Se…

Flink 介绍(特性、概念、故障容错、运维部署、应用场景)

概述 特性 概念 数据流 状态 时间 savepoint 故障容错 运维部署 部署应用到任意地方 Flink能够更方便地升级、迁移、暂停、恢复应用服务 监控和控制应用服务 运行任意规模应用 应用场景 事件驱动型应用 什么是事件驱动型应用? 事件驱动型应用的优势 Flink如何…

OpenCV高级图形用户界面(14)交互式地选择一个或多个感兴趣区域函数selectROIs()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 允许用户在给定的图像上选择多个 ROI。 该函数创建一个窗口&#xff0c;并允许用户使用鼠标来选择多个 ROI。控制方式&#xff1a;使用空格键或…

如何用示波器检测次级点火系统(一)

写在最前面&#xff1a; 单看标题可能会让你觉得这篇文章的主题是关于检测线圈&#xff0c;火花塞和火花塞插头电线。但我们指的是分析燃烧室内电子的行为。目标是看燃料混合物&#xff0c;阀座&#xff0c;压缩&#xff0c;积碳和其它影响这种特性的症状。最终目的是要学会分…

基于springboot vue的音乐播放系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

基于SpringBoot+Vue+uniapp微信小程序的乡村政务服务系统的详细设计和实现(源码+lw+部署文档+讲解等)

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

RiproV9.0主题wordpress主题免扩展可二开PJ版/WordPress博客主题Ripro全解密无后门版本

&#x1f525;&#x1f389; 全新RiPro9.0开源版发布 —— 探索无限可能&#x1f680;&#x1f310; 今天&#xff0c;我很高兴能与大家分享一个重磅资源——RiPro9.0开源版&#xff01;这不是一个普通的版本&#xff0c;而是一个经过精心打磨、全面解密的力作。&#x1f50d;…