DataGear制作基于three.js的3D数据可视化看板

DataGear专业版 1.0.0 已发布,欢迎试用! datagear.tech/pro/

DataGear 支持采用原生的HTML、JavaScript、CSS制作数据可视化看板,也支持导入由npmvite等前端工具构建的前端程序包。得益于这一特性,可以很容易制作基于three.js的3D数据可视化看板。

首先,参考three.js的官方教程 threejs.org/docs/index.... 编写3D前端源码包。

源码包中包含两个文件:index.htmlmain.js,如下所示:

index.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script type="module" src="/main.js"></script>
<script type="module">
import { ThreeRenderer } from "/main.js";
window.ThreeRenderer = ThreeRenderer;
</script>
<div style="padding:1rem;">
  <button onclick="threeRender()">渲染</button>
  <button onclick="threeUpdate()">更新</button>
  <p></p>
  <div id="threeChart" style="width:300px;height:300px;"></div>
</div>
<script>
var renderer;
function threeRender(){
  renderer = new ThreeRenderer(document.getElementById("threeChart"));
  renderer.render();
}
function threeUpdate(){
  renderer.update(0xff0000);
}
</script>
</body>
</html>

index.html是下述main.js中定义3D组件的调试页面,点击【渲染】、【更新】按钮可调试3D组件效果。

main.js

javascript 复制代码
import * as THREE from 'three';

export function ThreeRenderer(dom)
{
  this.dom = dom;
	
  this.render = function()
  {
    const scene = new THREE.Scene();
    const camera = new THREE.PerspectiveCamera( 75, this.dom.clientWidth / this.dom.clientHeight, 0.1, 1000 );
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize( this.dom.clientWidth, this.dom.clientHeight );
    this.dom.appendChild( renderer.domElement );
    const geometry = new THREE.BoxGeometry( 1, 1, 1 );
    const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
    const cube = new THREE.Mesh( geometry, material );
    scene.add( cube );
    camera.position.z = 5;
    
    function animate() {
      requestAnimationFrame( animate );
      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;
      renderer.render( scene, camera );
    }
	  
    animate();
    
    this.cube = cube;
  };
	
  this.update = function(hexColor)
  {
    const cube = this.cube;
    const material = cube.material;
    const color = material.color;
    color.setHex(hexColor);
  };
}

main.js定义了一个ThreeRenderer3D组件类,大部分代码由three.js官方教程拷贝,它的render函数绘制一个简单的3D立方体, update函数可以更新这个3D立方体的颜色。

调试:

css 复制代码
npm install --save three
npm install --save-dev vite
npx vite

执行npx vite build将它们构建为前端程序包:

bash 复制代码
index.html
assets/index-*.js

先将上述前端程序包压缩为ZIP包后导入为DataGear看板,然后将index.html中的

xml 复制代码
<script type="module" crossorigin src="/assets/index-*.js"></script>

修改为采用相对路径引入方式:

xml 复制代码
<script type="module" crossorigin src="assets/index-*.js"></script>

此时,点击【保存并展示】看板后,打开展示页面,点击【渲染】、【更新】按钮,将可以看到3D效果,如下所示:

下面,我们将上述3D组件制作为DataGear自定义图表,可以根据数据集返回的数值,更新其颜色。

首先,新建SQL数据集:

名称:最新指标值

SQL:

vbnet 复制代码
SELECT
	D_VALUE AS VALUE
FROM
	t_date_value
ORDER BY
	d_date DESC
LIMIT 0, 1

上述SQL从t_date_value表中查询最新日期的指标值

然后,新建一个关联上述数据集的自定义类型的图表;

名称:最新指标值

图表类型:自定义

数据集:最新指标值

更新间隔:2000毫秒

上述图表每隔2秒更新一次数据

最后,修改刚才导入看板的index.html,添加自定义图表渲染器,当t_date_value表中最新指标值大于等于80时,将3D模型渲染为红色,否则,渲染为绿色。

修改后的index.html如下所示:

html 复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="assets/index-*.js"></script>
<script>
//自定义图表渲染器
var chartRenderer =
{
  render: function(chart)
  {
    var internal = new ThreeRenderer(chart.element());
    internal.render();
    chart.internal(internal);
  },
  update: function(chart, results)
  {
    var chartDataSet = chart.chartDataSetMain();
    var result = chart.resultOf(results, chartDataSet);
    var value = chart.resultCell(result, "VALUE", 0);
    var color = (value >= 80 ? 0xff0000 : 0x00ff00);
    var internal = chart.internal();
    internal.update(color);
  }
};
</script>
</head>
<body>
<div style="padding:1rem;text-align:center;">
 <h1>DataGear制作3D图表</h1>
 <h5>http://www.datagear.tech</h5>
  <div style="display:inline-block;width:300px;height:300px;margin:1rem;"
    dg-chart-renderer="chartRenderer" dg-chart-widget="【图表ID】"></div>
  
  <div style="display:inline-block;width:300px;height:300px;margin:1rem;"
    dg-chart-renderer="chartRenderer" dg-chart-widget="【图表ID】"></div>
</div>
</body>
</html>

上述assets/index-*.js应替换为实际的JS文件名,【图表ID】应替换为实际的最新指标值图表的ID

点击【保存并展示】,即可看到3D图表效果,如下图所示:

官网地址:www.datagear.tech

源码地址:

Gitee:gitee.com/datagear/da...

Github:github.com/datageartec...

相关推荐
知行行行9 小时前
手把手教学系列之R语言绘图——饼图
数据可视化
FreedomLeo119 小时前
Python数据分析NumPy和pandas(二十九、其他Python可视化工具)
python·数据分析·数据可视化·numpy和pandas
B站计算机毕业设计超人20 小时前
计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习
爬虫·python·深度学习·机器学习·知识图谱·数据可视化·推荐算法
希艾席蒂恩1 天前
选择适合你的报表工具,山海鲸报表与Tableau深度对比
信息可视化·数据挖掘·数据分析·数据可视化·报表工具·免费软件
qingyunliushuiyu1 天前
智能数据分析系统-助力企业迈向数字化转型时代
数据分析·数据可视化·数据分析系统·智能数据分析系统·bi数据分析系统
RestCloud1 天前
ETLCloud支持的数据处理类型包括哪些?
数据库·数据分析·数据可视化
阡之尘埃2 天前
Python数据分析案例64——杭帮菜美食探索数据分析可视化
python·数据挖掘·数据分析·pandas·数据可视化·美食·杭帮菜
叫我:松哥2 天前
基于python的天气数据采集与可视化分析,对20个城市的天气适宜出行度分析
开发语言·爬虫·python·数据分析·matplotlib·数据可视化·天气
纯小白是我3 天前
Linux可视化工具cockpit
linux·运维·服务器·centos·数据可视化
B站计算机毕业设计超人3 天前
计算机毕业设计Python+大模型动漫推荐系统 动漫视频推荐系统 机器学习 协同过滤推荐算法 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计
大数据·爬虫·python·机器学习·课程设计·数据可视化·推荐算法