本文首发于 NebulaGraph 公众号

前言图数据可视化是现代 Web 可视化技术中比较常见的一种展示方式,NebulaGraph Explorer 作为基于 NebulaGraph 的可视化产品,在可视化图数据领域,尤其是在图形渲染性能等领域积累了较丰富的经验。本文将系统性分享 NebulaGraph Explorer 在 3D 图数据展示上的一些应用。以下演示皆可在 https://explorer.nebula-graph.com.cn/explorer 在线试用。二维力导图目前业界常用的图数据展示都采用 2D 力导图的逻辑,如下图所示:



这种二维化的可视化模式,在图形语义上对物理世界数据进行了降维,通过点、边形状来描述实体和关系,符合人脑的习惯性直觉,简化了图数据的理解成本。D3-force,G6 等所采用的就是这样一种布局模式,也是大部分图类场景的基础算法。其布局的力导算法则是大部分基于经典的 Fruchterman 布局算法,模拟弹簧的胡克定律和物体的万有引力,制造相互牵引和排斥的力算法,再通过模拟冷却收敛,最终得到减少交叉、步长等距、点分离独立 的二维图布局。这也是可视化的基本诉求,即能够无遮挡地清晰查看各类繁杂的数据。然而,2D 场景并不一定适用所有场景,主要有以下原因:空间信息展示部分数据具有原生的空间坐标信息,且这部分信息也不可降维,如分子结构、经纬度的球坐标展示、具有层级高度的数据等。这类数据通过 3D 展示会更符合人的习惯和直觉。大数据量布局展示在较大的数据集情况下,由于 2D 没有深度,导致所有的数据需要被平铺在画布上,可以想象一个西瓜的所有西瓜籽平铺的情况,占地面积要远远大于西瓜本身。因此这种情况需要将数据本身信息可视化还原,就需要 3D 可视化技术来实现了。



图数据 3D 可视化图数据的 3D 可视化在逻辑上和 2D 比较像,我们一般依然是采用 2D 的 Fruchterman 力导图逻辑,也依然需要尽量避免交叉遮挡,但维度升了一维,逻辑复杂的也上升不少。因此我们重新自研了 3D 力导向算法来获得更好的效果和性能。可以看到下图同样的复杂网络关系中,3D 显示则会有较为明确的关系展示。提供不同角度的图结构



对于高密度的点边,可以像 3D 游戏一样,将视角转移,切换,观察到不同角度的图数据结构



相同的数据也可以有完全不同的可视化效果。提供鸟瞰视角



在 3D 鸟瞰情况下,可以将点再空间方向散射开,同样数据量下,画布能清晰的标识出节点团簇,也可以轻松的识别出超级节点。通过屏幕内的整体颜色分布,能大致看出来整个可视化图中的节点 Tag 占比。身临其境的体验感



用户可以再整个空间内搜索节点,直接定位到对应节点上,查看相关连的其余节点数据。高性能可视化目前我们的 3D 可视化可以支持 10w 点,10w 边同时渲染。渲染数量是由渲染性能,布局计算性能,内存占用,网络速率,NebulaGraph 性能等各方面因素综合决定的,上限主要由硬件和外部条件限制(网速,客户度机器配置,NebulaGraph机器性能)决定,下限则是由图形渲染及布局算法决定。我们为了提高下限,自研了图形渲染和布局算法部分,得到了较好的效果。海量数据渲染WebGL 是 web 端直接利用 GPU 进行渲染的方式。我们为了提高每一帧的图形渲染能力,在 3D 模式下采用 WebGL 来进行渲染。并且支持高低性能模式:



分别通过原生 shader 和 Mesh 绘制,用户可以根据自己电脑终端的硬件情况选择对应的渲染模式。其中高性能模式下,我们通过自研优化的 shader,利用 GPU 并行计算的能力,将一些渲染效果放到着色器中计算,极大的提高了渲染速率,让渲染性能不再成为瓶颈。这也基本上达到了目前浏览器的极限。快速算法布局在图布局算法方面,我们用八叉树优化了力导过程的算力消耗,并且针对使用 LinLog 模型对超级点进行了受力优化,由于算法性能消耗比较大,我们使用 Golang 对八叉树算法和力导算法进行了重写,最终可以支持在 20w 图元的情况下,预热完成后稳定在 1s 以下完成一次运算。



另外为了图布局计算不影响前台页面渲染,我们利用多个 worker 进程,将不同的 CPU 任务分布下去,这样木桶的各个短板不会影响渲染和交互的长板,用户在布局的时候依然可以灵活的操作。利用上述的一些手段,我们将 3D 可视化的性能几乎提升到浏览器极限,对于一些不大的图空间数据,完全可以一次性载入分析。后续方向由于 3D 模式的开发复杂度较 2D 提升较多,因此目前仅用于一种特殊的图数据展示方式。在未来,我们会综合实际的业务场景,进行更多的体验优化。时序及 GIS 领域的图布局映射图数据坐标到渲染中增加边的相关交互行为


原文链接:https://www.nebula-graph.com.cn/posts/dag-controller

交流图数据库技术?加入 NebulaGraph 交流群请先填写下你的 NebulaGraph 名片,NebulaGraph 小助手会拉你进群~~

图数据 3D 可视化在 Explorer 中的应用的更多相关文章

  1. 数据可视化:Echart中k图实现动态阈值报警及实时更新数据

    1 目标 使用Echart的k图展现上下阈值,并且当真实值超过上阈值或低于下阈值时候,标红报警. 2 实现效果 如下:

  2. 基于 HTML5 的 WebGL 和 VR 技术的 3D 机房数据中心可视化

    前言 在 3D 机房数据中心可视化应用中,随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的 ...

  3. B/S 端基于 HTML5 + WebGL 的 VR 3D 机房数据中心可视化

    前言 在 3D 机房数据中心可视化应用中,随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的 ...

  4. 基于 HTML5 WebGL 和 VR 技术的 3D 机房数据中心可视化

    前言 在 3D 机房数据中心可视化应用中,随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的 ...

  5. 基于 HTML5 WebGL + VR 的 3D 机房数据中心可视化

    前言 在 3D 机房数据中心可视化应用中,随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的 ...

  6. 浅谈工业4.0背景下的空中数据端口,无人机3D 可视化系统的应用

    前言 近年来,无人机的发展越发迅速,既可民用于航拍,又可军用于侦察,涉及行业广泛,把无人机想象成一个“会飞的传感器”,无人机就成了工业4.0的一个空中数据端口,大至地球物理.气象.农业数据.小至个人位 ...

  7. 数据可视化之powerBI基础(十一)Power BI中的数据如何导出到Excel中?

    https://zhuanlan.zhihu.com/p/64415543 把Excel中数据加载到PowerBI中我们都已经熟悉了,但是怎么把在PowerBI中处理好的数据导出到Excel中呢?毕竟 ...

  8. echarts中饼状图数据太多进行翻页

    echarts饼状图数据太多 echarts 饼状图内容太多怎么处理 有些时候,我们饼状图中echarts的数据可能会很多. 这个时候展示肯定会密密麻麻的.导致显示很凌乱 我们需要'翻页'类似表格展示 ...

  9. 基于 HTML5 WebGL 的地铁站 3D 可视化系统

    前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...

随机推荐

  1. python常量与变量的本质

    python语法常量与变量的本质 python语法之注释 1.python语法注释有哪几种? (1.)单行注释 # 井号键单行注释 使用方法:首先在另起一行按('#')井号键进行注释,如果需要代码后面 ...

  2. C#基础_C#计算样本标准差和总体标准差

    首先我们先了解样本标准差和总体标准差: 样本标准差=方差的算术平方根=s=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/(n-1)) 总体标准差=σ=sqrt(( ...

  3. 【JDBC】学习路径1-JDBC背景知识

    学习完本系列JDBC课程后,你就可以愉快使用Java操作我们的MySQL数据库了. 各种数据分析都不在话下了. 第一章:废话 JDBC编程,就是写Java的时候,调用了数据库. Java Databa ...

  4. ping: sina.cn: Name or service not known

    该方法针对Ubuntu18及以后版本. 第一次遇到ping:报错Name or service not known这个问题在百度上找了很久说的都是什么修改 /etc/resolv.conf,但每次修改 ...

  5. 聊聊两个Go即将过时的GC优化策略

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 这篇文章本来是要讲 Go Memory Ballast 以及 Go GC Tuner 来 ...

  6. 如何在JavaScript中使用高阶函数

    将另一个函数作为参数的函数,或者定义一个函数作为返回值的函数,被称为高阶函数. JavaScript可以接受高阶函数.这种处理高阶函数的能力以及其他特点,使JavaScript成为非常适合函数式编程的 ...

  7. STL堆排序&时间复杂度分析

    1. 逻辑&时间复杂度分析 pop 和 initialize 的时间复杂度请参考: [DSAAinC++] 大根堆的pop&remove&initialize 将数组初始化为一 ...

  8. Helm3 安装 ElasticSearch & Kibana 7.x 版本

    文章转载自:http://www.mydlq.club/article/13/ 系统环境: helm 版本:v3.2.1 Kubernetes 版本:1.18.3 ElasticSearch Char ...

  9. Ceph 存储集群第一部分:配置和部署

    内容来源于官方,经过个人实践操作整理,官方地址:http://docs.ceph.org.cn/rados/ 所有 Ceph 部署都始于 Ceph 存储集群. 基于 RADOS 的 Ceph 对象存储 ...

  10. Secret概述

    Secret 概述 Kubernetes Secret 对象可以用来储存敏感信息,例如:密码.OAuth token.ssh 密钥等.如果不使用 Secret,此类信息可能被放置在 Pod 定义中或者 ...