JavaScript 3D图表

在说3D图表以前,首先要明确两个概念,一个是数据的维度,一个是呈现数据载体的维度。对于数据的维度,一维的数据呈现,但是呈现的载体是二维的平面图,比如饼图:

JavaScript 3D图表

已经能够很清晰地观察到数据的分布情况。数据如果增加一个维度,变成二维,呈现载体依然是二维的平面图:

JavaScript 3D图表

数据表达依然是清晰的。但是,倘若再增加一维,这个时候就面临了两个问题:

  1. 数据的维度增加,复杂性也增大了;
  2. 计算机发展到现在,绝大多数情况下数据载体依然是二维的平面图,如何展示三维的数据呢?

这两个问题中,第一个问题从本质上说,无法解决。数据的维度越大,理解起来理所当然地,也越来越困难。

但是第二个问题,我们至少有两种解决办法。一种,在当前二维图表的基础上,通过颜色、图形、数值的不同等等,来表示第三个维度的数据。例如,利用颜色不同来表示第三个维度的热图:

JavaScript 3D图表

在两个维度经度和维度的情况下,第三个维度温度通过颜色的不同来展示了。

另一种,就是绘制3D的图形,把第三个维度展示出来。需要注意的是,绘制3D的图形仅仅是技术上的一种呈现形式,并不意味着它的易懂性要好于上面一种方式。实际上,我们还是需要看看具体的问题是什么。

明确了这些概念以后,我再来介绍两则JavaScript的3D图表,它们都是为了呈现三维的数据,而不仅仅是看起来3D而已,大部分JavaScript的3D图表库都是基于Canvas的,如果你对Canvas不了解请移步参阅这篇文章;其中一些则是支持WebGL的。WebGL是一种3D的绘图标准,有了它,JavaScript就可以实现OpenGL标准能做的事情了,在HTML5 Canvas基础上,WebGL允许硬件3D加速。

webgl-surface-plot

JavaScript 3D图表

 

主页点此。特性列表:

  • 纯JavaScript实现,不需要Flash;
  • 鼠标左键拖拽可以翻转图像;
  • 按住Shift键可以缩放;
  • Web GL不可用的时候,可以直接使用Canvas绘制;
  • 自定义坐标轴名称;
  • 自定义颜色梯度和渐变;
  • 包装为Google Visualization API的一部分。

在IE下,借助excanvas可以在VML下得到一样的效果。

对于这个例子,简单过一下重点代码,首先这部分是着色器的代码(片段着色器和顶点着色器),包括坐标轴和纹理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
< script id = "shader-fs" type = "x-shader/x-fragment" >
     #ifdef GL_ES
     precision highp float;
     #endif
     varying vec4 vColor;
     varying vec3 vLightWeighting;
     void main(void)
     {
     gl_FragColor = vec4(vColor.rgb * vLightWeighting, vColor.a);
     }
</ script >
< script id = "shader-vs" type = "x-shader/x-vertex" >
     attribute vec3 aVertexPosition;
     attribute vec3 aVertexNormal;
     attribute vec4 aVertexColor;
     uniform mat4 uMVMatrix;
     uniform mat4 uPMatrix;
     uniform mat3 uNMatrix;
     varying vec4 vColor;
     uniform vec3 uAmbientColor;
     uniform vec3 uLightingDirection;
     uniform vec3 uDirectionalColor;
     varying vec3 vLightWeighting;
     void main(void)
     {
     gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
     vec3 transformedNormal = uNMatrix * aVertexNormal;
     float directionalLightWeighting = max(dot(transformedNormal, uLightingDirection), 0.0);
     vLightWeighting = uAmbientColor + uDirectionalColor * directionalLightWeighting;
     vColor = aVertexColor;
     }
</ script >
< script id = "axes-shader-fs" type = "x-shader/x-fragment" >
     precision mediump float;
     varying vec4 vColor;
     void main(void)
     {
     gl_FragColor = vColor;
     }
</ script >
< script id = "axes-shader-vs" type = "x-shader/x-vertex" >
     attribute vec3 aVertexPosition;
     attribute vec4 aVertexColor;
     uniform mat4 uMVMatrix;
     uniform mat4 uPMatrix;
     varying vec4 vColor;
     uniform vec3 uAxesColour;
     void main(void)
     {
     gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
     vColor =  vec4(uAxesColour, 1.0);
     }
</ script >
< script id = "texture-shader-fs" type = "x-shader/x-fragment" >
     #ifdef GL_ES
     precision highp float;
     #endif
     varying vec2 vTextureCoord;
     uniform sampler2D uSampler;
     void main(void)
     {
     gl_FragColor = texture2D(uSampler, vTextureCoord);
     }
</ script >
< script id = "texture-shader-vs" type = "x-shader/x-vertex" >
     attribute vec3 aVertexPosition;
     attribute vec2 aTextureCoord;
     varying vec2 vTextureCoord;
     uniform mat4 uMVMatrix;
     uniform mat4 uPMatrix;
     void main(void)
     {
     gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
     vTextureCoord = aTextureCoord;
     }
</ script >

这个方法用于保持两图步调一致:

1
2
3
4
5
6
7
8
9
10
11
12
function coordinateCharts(){
     // Link the two charts for rotation.
     
     plot1 = surfacePlot.getChart();
     plot2 = surfacePlot2.getChart();
     
     if (!plot1 || !plot2)
         return ;
     
     plot1.otherPlots = [plot2];
     plot2.otherPlots = [plot1];
}

每发生变化需要重绘的时候,调用:

1
2
surfacePlot.draw(data, options, basicPlotOptions, glOptions);
surfacePlot2.draw(data2, options, basicPlotOptions2, glOptions2);

Demoparse主要用来根据用户输入的公式f(x,y)计算z的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function Demoparse(ID_result, ID_code, valueArray, toolTips){
     var el, expr;
     el = document.getElementById(ID_result)
     expr = document.getElementById(ID_code).value;
     expr = Parser.parse(expr);
     var result;
     var idx = 0;
     var d = 360 / numRows;
     
     for ( var x = 0; x < numRows; x++) {
     
         valueArray[x] = new Array();
         
         for ( var y = 0; y < numCols; y++) {
         
             result = expr.simplify({
                 x: x * d,
                 y: y * d
             });
             
             result = result.evaluate();
             
             valueArray[x][y] = result / 4.0 + 0.25;
             
             toolTips[idx] = "x:" + x + ", y:" + y + " = " + result;
             idx++;
             
         }
         
     }
     
}

Canvas 3D Graph

相比前者,Canvas 3D Graph真是太简单了,如果你需要这种风格的柱状图:

JavaScript 3D图表

demo的代码非常简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Initialise Graph 
var g = new canvasGraph( 'graph' ); 
           
//define some data 
gData= new Array(); 
           
gData[0]={x:500,y:500,z:500}; 
gData[1]={x:500,y:400,z:600}; 
gData[2]={x:500,y:300,z:700}; 
gData[3]={x:500,y:200,z:800}; 
gData[4]={x:500,y:100,z:900}; 
 
// sort data - draw farest elements first        
gData.sort(sortNumByZ); 
           
//draw graph  
g.drawGraph(gData);

PS:如果你遇到无法显示WebGL图形的问题——它不仅对浏览器,还对硬件有要求。如果你使用Opera浏览器,在地址栏输入about:gpu,以查看你的显卡是否被支持。如果是FireFox,地址栏输入about:config,寻找webgl.force-enabled,双击,将该值改为true即可。

文章系本人原创,转载请保持完整性并注明出自《四火的唠叨》

JavaScript 3D线条系列 3D线条系列 阅读详情

相关推荐

Vue 3 + Three.js 打造轻量级 3D 图表库 —— chart3

摘要:开发者"一颗烂土豆"基于Vue 3和Three.js打造了轻量级3D图表库chart3,旨在简化3D数据可视化开发。该库支持柱状图、饼图等基础3D图表,提供可视化配置系统,包含材质、灯光等调节功能,支持交互操作。项目正处于快速迭代阶段,未来计划开发曲面图、3D地图等高级功能,优化渲染性能并完善文档体系。通过JSON配置即可生成真实3D效果的图表,让数据呈现更具立体感和视觉冲击力。(149字)

weixin_40605367的博客 1233

vue项目基于D3js的3D饼图实现(二)

注意这里在Pie3D.vue文件中加了一个sfShowLabel的配置项。在pie.js中添加如下代码。

qq_40011214的博客 480

JavaScript 3D 散点图

3D 散点图

ArctionLtd的博客 1563

js + highcharts 实现3d饼图

js + highcharts 实现3d饼图。

奇点的博客 2083

探索ECharts.js创建的JS 3D渐变柱状图表特效

htmltable {th, td {th {pre {简介:JS 3D渐变柱状图表特效是一种结合了3D视觉效果和渐变色彩的网页数据可视化方法。该特效基于ECharts.js图表库实现,它提供丰富的图表类型和高度的交互性,包括数据布局、自定义选项和响应式设计。这种图表适用于商业分析、网站统计等场景,能够有效提升数据的可读性和吸引力。

weixin_42527589的博客 1250

IAR for ARM 搭建STM32F103C8T6工程模板(实战指南)

本文详细介绍了如何在IAR for ARM开发环境中为STM32F103C8T6微控制器搭建完整的工程模板。从环境准备、固件库获取、目录结构设计到工程配置与编译调试,提供了实战指南和常见问题解决方案,帮助开发者快速建立稳定的STM32开发环境。

fun88的博客 989

vue项目基于D3js的3D饼图实现(三)

创建横向普通图例的实现,效果图如下。

qq_40011214的博客 1105

【超详细】数据分析笔试题分享,可以收藏后仔细阅读_数据分析岗位笔试题目

这种做法是最精确的做法,保留了所有的信息,也未添加任何额外信息,若预处理时把所有的变量都这样处理,会大大增加数据的维度。15、在某座城市出现了某种流行病,且已知某座城市男女人数相同,男性患该病的概率为5%,女性为0.25%,现已知该城市的小明得了此病,请问小明为男性的概率是() B。D项,使用方差作为特征评分标准,如果某个特征的取值差异不大,通常认为该特征对区分样本的贡献度不大,因此在构造特征过程中去掉方差小于阈值的特征。LTV,用户生命周期价值,是产品从用户获取到流失所得到的全部收益的总和。

2401_89824744的博客 950

3d饼图实现

实现3d饼图效果

qq_44162778的博客 1086

低成本实现webhook接收端[python]

Webook本质上也是API,只不过是反向调用,即前端不主动发送请求,完全由后端推送。简单来说,Webhook是一个接受HTTP POST或是GET,PUT,DELETE的URL,一个实现了Webhook的API提供商就是在当事件发生的时候会向配置的URL发送信息,与请求-响应式不同,使用Webhook可以实时接收到变化。Ps:Webhook可能会发出大量的请求,确保接受的URL不被泄露或者应用能及时处理这些请求。

锡城小凯的博客 1万+

MinIO vs 华为云OBS:成本、性能与兼容性深度对比(含实测数据)

本文深度对比了开源对象存储MinIO与华为云OBS在成本、性能、兼容性及运维方面的核心差异。通过实测数据与全生命周期成本分析,为技术决策者提供选型依据。文章指出,MinIO在长期成本控制、性能深度优化及S3 API兼容性方面优势显著,而华为云OBS则提供开箱即用的便利性。

kmeans3miner的博客 595

LightningChart JS Crack,2D 和 3D JavaScript 图表

  LightningChart JS Crack是一个基于 WebGL、GPU 加速的跨平台图表库,旨在为最苛刻的数据驱动应用程序提供出色的性能。性能高达 10M+ 的实时数据点。LightningChart 的图表库结合了令人难以置信的速度和强大的负载能力。针对工程、医疗保健工程和医疗设备、工业过程控制和科学应用等要求严苛的行业进行了优化。LightningChart JS 包括多个框架应用程序开发模板,适用于 iOS、Android、React、Vue JS、ASP.NET、Blazor、Xamari

q2315702359的博客 621

MMI分束器仿真优化:用Lumerical FDTD实现95%耦合效率的实战技巧

本文详细介绍了使用Lumerical FDTD软件对MMI分束器进行仿真优化的实战技巧。通过构建高保真模型、精确配置光源与边界条件,并重点优化波导结构与taper设计,系统性地将器件的耦合效率提升至95%以上。文章还分享了利用参数扫描、varFDTD加速等高级方法,帮助硅光芯片设计工程师高效实现高性能MMI分束器设计。

rainy的博客 773

vis用于做3D图表的js插件

vis.js用于做3D图表:(浏览网站需要FQ)实例:http://visjs.org/graph3d_examples.html代码下载:https://github.com/almende/vis 转载于:https://www.cnblogs.com/johnblogs/p/6215413.html...

weixin_30735745的博客 359

SoC设计中的RDC陷阱:如何避免异步复位导致的亚稳态问题

本文深入探讨了SoC设计中由异步复位引发的复位域交叉(RDC)陷阱及其导致的亚稳态风险。通过分析实际案例,文章系统性地提出了以同步复位优先、异步复位同步释放为核心的设计原则,并介绍了电路级加固与验证策略,为构建稳健的SoC复位架构提供了实用指南。

weixin_29280657的博客 419

第8讲:基于CST PCB Studio的电源完整性仿真(IR Drop + PDN)

本文系统介绍了电源完整性(PI)仿真的两大核心模块:直流IRDrop仿真与交流PDN阻抗仿真。文章详细阐述了两种仿真的原理、算法(PEEC和3DFE-FD)及完整操作流程,包括参数配置、软件实操步骤和常见问题解决方案。IRDrop仿真用于分析直流供电压降问题,PDN仿真则针对高频电源噪声和谐振问题。文中还提供了优化建议和故障排查方法,如调整铜箔厚度、优化电容布局等,为高速数字系统的电源完整性设计提供了全面的技术指导。(149字)

一只豌豆象的博客 239

js 3d能耗流动图表_10 个图表库,承包了 2020 年你想要的酷炫

作者:凉皮编辑:西西姐封面图:侯爵老师在这样的一个数据时代,很多事情都是靠数据说话,数据可视化可谓十分重要,一图胜千言。我们精选了 10 个图表库,无论你是想快速上手做一个数据可视化的网站,还是想做一个汇总数据的仪表盘,又或者想在会议上更好的展示数据,都能在这里面找到最适合你的那一个?D3.js 可以说是图表最全的库了,你能想到的图表类型这里都有。它也是 GitHub 上加星数最多的...

weixin_42376799的博客 949

SAP FICO资产明细表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO资产明细表开发说明书(包括源代码,测试样例及FS)

我好像病了的博客 1470

【转】JavaScript 3D图表

文章系本人原创,转载请保持完整性并注明出自《四火的唠叨》 在说3D图表以前,首先要明确两个概念,一个是数据的维度,一个是呈现数据载体的维度。对于数据的维度,一维的数据呈现,但是呈现的载体是二维的平面图,比如饼图: 已经能够很清晰地观察到数据的分布情况。数据如果增加一个维度,变成二维,呈现载体依然是二维的平面图: 数据表达依然是清晰的。但是,倘若再增加一维,这个时候就面临了两个问题: ...

weixin_30799995的博客 87

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

使用引人入胜3D图表可视化复杂数据-LightningChart JS

LightningChart JS​​​​​​​-3D 图表允许沿第三轴进行深度数据可视化。此功能超越了传统的 2D 图表,提供了更具沉浸感和信息量的视图。3D 图表对于具有多个变量的复杂数据集特别有用,因为它们可以揭示平面格式中可能被掩盖的模式和关系。用例包括展示跨地区和人口统计数据的产品销售情况、可视化随时间变化的财务趋势或以多个维度描绘科学数据。

控件与插件之大全 499

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

为什么你不需要 JS 来制作 3D 图表

原文:towardsdatascience.com/la-crime-now-in-3d-no-glasses-required-498398c25a39?

龙哥盟 628

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

使用Vue3和Plotly.js绘制动态3D图表的示例代码

Vue 3 是一个用于构建用户界面的渐进式 JavaScript 框架,而 Plotly.js 是一个基于 D3.js 的图表库,它提供了丰富的图表类型,包括动态的 3D 图表。下面是一个简单的示例代码,展示如何在 Vue 3 应用程序中使用 Plotly.js 来绘制一个动态的 3D 散点图。请注意,这只是一个基本示例,你可以根据需要调整数据和配置选项来创建更复杂的图表。此外,Plotly.js 还支持许多其他类型的图表和交互功能,你可以查阅官方文档来获取更多信息。对象来定义图表的数据和样式,一个。

云加速 559

JavaScript图表库LightningChart JS最新版本v2.1.0发布,改进了新发布的3D图表

LightningChart JS是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用,从而实现高刷新率和流畅的动画。非常适合用于贸易,工程,航空航天,医药和其他领域的应用。 点击下载LightningChart JS最新试用版 安装:npm install @arction/lcjs 此版本专注于改进我们新发布的整洁3D图表。现在可以使用更高级的3D图表,例如3D Surface系列和3D Box系列。 此版

RoffeyYang的博客 191

Plotly.js核心功能详解:如何用JavaScript创建令人惊艳的3D数据可视化

Plotly.js是一个功能强大的JavaScript库,专为创建交互式数据可视化而设计。无论是简单的折线图还是复杂的3D模型,Plotly.js都能帮助开发者轻松实现令人惊艳的数据展示效果。本文将深入探讨Plotly.js的核心功能,特别是其在3D数据可视化方面的应用,帮助新手快速掌握这个强大工具的使用方法。 ## 一、Plotly.js简介:为什么选择它进行数据可视化? Plotly.js

gitblog_01166的博客 1076
上一篇: 工程师的生活
下一篇: 不安分的工程师
RayChase
博客等级 码龄20年 71粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值