使用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入门机型计算用量…

【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;包名 实体类的定义…

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;&…

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;微调和推理阶段的资源消耗也在增加。…

爬虫实战(黑马论坛)

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…

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

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

华为OD机试 - 爱吃蟠桃的孙悟空 - 二分查找(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

决策树和集成学习的概念以及部分推导

一、决策树 1、概述 决策树是一种树形结构&#xff0c;树中每个内部节点表示一个特征上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff0c;每个叶子节点代表一种分类结果 决策树的建立过程&#xff1a; 特征选择&#xff1a;选择有较强分类能力的特征决策树生成…

闯关leetcode——110. Balanced Binary Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/balanced-binary-tree/description/ 内容 Given a binary tree, determine if it is height-balanced. A height-balanced binary tree is a binary tree in which the depth of the two subtrees…

决策树算法新手入门:从基础理论到Python实现

决策树新手入门详细教程 一、数学基础1. 信息熵(1) 基本定义(2) 条件熵(3) 有关定律 2. 信息增益 二、决策树的组成1. 决策节点2. 叶子节点3. 决策树的深度 三、决策树的建立&#xff08;基于信息增益&#xff09;—— ID31. 计算根节点的信息熵2. 计算属性的信息增益(1) 职业(…

【升华】python基础包NumPy学习

NumPy是使用Python进行科学计算的基础软件包。除其他外&#xff0c;它包括&#xff1a; 功能强大的N维数组对象。精密广播功能函数。集成 C/C和Fortran 代码的工具。强大的线性代数、傅立叶变换和随机数功能。 # 1、安装包 $ pip install numpy# 2、进入python的交互式界面 $…

蓄电池在线监测:保障电力安全的智能之选---安科瑞 吴雅芳

一、蓄电池在线监测的重要性 随着科技的飞速发展&#xff0c;蓄电池在各个领域的应用日益广泛&#xff0c;从通信、电力到金融、医疗等行业&#xff0c;蓄电池都扮演着至关重要的角色。然而&#xff0c;蓄电池在使用过程中也面临着诸多问题。 蓄电池老化可能导致鼓胀、短路、漏…

React 子组件调用父组件的方法,以及互相传递数据

<script type"text/babel" data-type"module"> import React, { StrictMode, useState } from react; import { createRoot } from react-dom/client;const ParentComponent () > {const [message, setMessage] useState("")//父组件…

【火山引擎】 Chat实践 | 大模型调用实践 | python

目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置

基于SSM的个性化商铺系统【附源码】

基于SSM的个性化商铺系统 效果如下&#xff1a; 用户登录界面 app首页界面 商品信息界面 店铺信息界面 用户功能界面 我的订单界面 后台登录界面 管理员功能界面 用户管理界面 商家管理界面 店铺信息管理界面 商家功能界面 个人中心界面 研究背景 研究背景 科学技术日新月异…