`

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即可。

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

1
1
分享到:
评论

相关推荐

    3D图表Highcharts(3D)

    Highcharts是一款强大的JavaScript图表库,它能够帮助开发者创建出各种精美、交互性强的2D和3D图表。在“3D图表Highcharts”这个主题中,我们将深入探讨如何利用Highcharts来实现三维图表的制作,以及它在数据可视化...

    基于ECharts GL的3D图表展示设计与实现

    而ECharts GL则是ECharts的一个扩展,专为处理大规模数据和提供高级3D图表而设计。本文将深入探讨如何利用ECharts GL进行3D图表的设计与实现。 **ECharts GL的介绍** ECharts GL是ECharts的高级扩展,主要针对3D...

    javascript 3D 特效.zip

    2. 3D图表的创建,包括块状、条状、横向和纵向的变换。 3. 图片在3D场景中的应用,如纹理贴图。 4. JavaScript DOM操作和事件处理。 5. 动画和时间帧的概念,用于实现平滑的3D过渡效果。 6. 可能会涉及jQuery及其...

    xCharts:基于D3的JavaScript图表库

    xCharts是一款基于D3的JavaScript图表库,xCharts的功能非常强大,不仅支持多种图表类型,而且拥有丰富的图表主题风格,并且非常漂亮。另外,xCharts的设计非常灵活,配置也比较简单,加载速度也还不错,是一款开放...

    基于WebGL实现的3D曲面图表组件

    【基于WebGL实现的3D曲面图表组件】是一种利用WebGL技术进行数据可视化的JavaScript开发组件,专门用于创建交互式的3D曲面图。WebGL是一种在浏览器中支持硬件加速的3D图形渲染标准,它允许开发者无需安装任何插件...

    javascript 3D炫酷地球动画,基于echarts实现

    在本项目中,我们探索了如何使用JavaScript和ECharts库创建一个3D炫酷的地球动画。ECharts是一个基于HTML5 Canvas技术的数据可视化库,它提供了丰富的图表类型和交互功能,使得开发人员能够轻松地构建出具有吸引力的...

    利用HTML5实现3D动态图表

    4. **ichart库分析**:提供的两个JavaScript文件,ichart-1.0.alpha.js和ichart-1.0.min.js,可能是用于简化3D图表创建的库。这类库通常封装了WebGL的复杂性,提供易于使用的API,帮助开发者快速生成各种图表,如...

    three.js三维图形图表特效.zip

    three.js是一个基于WebGL的JavaScript库,它使得在浏览器中构建复杂的3D场景变得简单易行。这个压缩包可能包含了一些已经实现的示例代码,供用户参考学习或者进行二次开发。 首先,我们需要了解WebGL,这是一种在...

    利用three.js绘制3d图表(柱状图,饼状图,环状图,面积图等) 可以给初学者作为一个参考

    总的来说,利用Three.js绘制3D图表需要理解3D图形的基本概念,熟悉Three.js的API,以及具备一定的数据处理和JavaScript编程能力。对于初学者来说,这是一个很好的实践项目,可以加深对3D图形和数据可视化的理解。

    HTML5 Canvas 3D折线图表.zip

    一些JavaScript库,如Three.js、 Babylon.js 或者Chart.js的扩展,提供了创建3D图表的便利工具。开发者可以通过这些库简化代码,快速构建3D折线图。 综上所述,"HTML5 Canvas 3D折线图表.zip"的内容可能包含了...

    3D立体柱状动画图表

    但对于3D图形,HTML5本身并不直接支持,而是通过WebGL这个JavaScript API来实现。WebGL允许开发者在浏览器中创建交互式的3D图形,无需任何插件。然而,对于非专业图形程序员,直接使用WebGL可能较为复杂,因此通常会...

    JS+CSS3 3D立体环形百分比进度条图表动画特效

    在这款名为"JS+CSS3 3D立体环形百分比进度条图表动画特效"的项目中,开发者利用JavaScript和CSS3的强大力量,创建了一个极具视觉吸引力的3D环形进度条。这个特效不仅提供了实时的百分比显示功能,而且通过3D立体效果...

    Learning Three.js_ The JavaScript 3D Library for WebGL.pdf

    ### 《Learning Three.js:The JavaScript 3D Library for WebGL》关键知识点解析 #### 一、书籍概述 《Learning Three.js:The JavaScript 3D Library for WebGL》是一本专为前端开发者撰写的书籍,旨在帮助读者...

    可视化图表库Vis.js 可构建近100种图表类型

    Vis.js是一款基于JavaScript的可视化图表库,vis.js不像其他的图表库那样仅仅支持几种常用的数据图表,比如线形图、柱状图、饼图等,Vis.js支持上百种不同类型的可视化图表类型,比如时间线图、网络图、2D图表、3D...

    基于HTML5 Canvas的3D动态Chart图表的示例

    3. **构建3D图表元素**:创建3D柱状图的各个部分,包括内部的实心柱和外部的透明柱,以及3D文字表示的百分比。使用`ht.Node` 创建节点对象,设置3D形状、颜色、透明度等属性。例如,设置3D圆柱模型: ```javascript...

    CSS3 3D柱形统计图表

    "CSS3 3D柱形统计图表"是一个利用CSS3的强大功能来创建具有立体感的柱状图的实践案例。这种图表在数据可视化和信息展示中非常常见,尤其适用于呈现比较和分析不同类别的数据。 首先,我们需要理解CSS3中的3D转换。...

    Three.js是一个用于创建3D图形的JavaScript库

    Three.js 是一个基于 WebGL 的开源 JavaScript 库,专门用于在 Web 浏览器中创建和展示交互式的三维图形。WebGL 是一种在浏览器中实现硬件加速的图形渲染技术,它允许开发者无需插件就能在网页上实现复杂的3D图形...

    Plotlyjs开源JavaScript图形库功能强大支持20种图表类型

    它提供了丰富的图表类型,包括但不限于线图、散点图、柱状图、饼图、热图、3D图表等,总计超过20种,能满足各种数据分析和展示的需求。 1. **基础概念** - **Plotly.js**: 作为一个JavaScript库,Plotly.js允许...

    3D立体环形百分比进度图表代码

    `js`文件则包含了实现3D环形进度图表功能的JavaScript代码。这部分代码可能包括以下几个关键部分: 1. **数据处理**:这部分代码会接收用户输入的0到100的整数,进行校验和转换,确保数据的有效性。 2. **3D图形库...

Global site tag (gtag.js) - Google Analytics