关于可视化的一些基础认知

797 阅读6分钟

Web 前端与可视化的区别

可视化是将数据组织成易于为人所理解和认知的结构,然后用图形的方式形象地呈现出来的理论、方法和技术。

Web 前端主要是以 HTML 来描述结构。以 CSS 来描述表现,以 JavaScript 来描述逻辑行为。

技术栈上的区别:

  • Web 前端:HTML、CSS、JavaScript
  • 可视化:Canvas、SVG、WebGL、JavaScript

开发内容的区别:

  • Web 前端:着重于处理普通的文本和多媒体信息,渲染普通的、易于阅读的文本和多媒体内容
  • 可视化:着重于处理结构化数据,渲染各种相对复杂的图表和图形元素。

可视化领域的工具

可视化领域经过多年的发展,有非常丰富的工具,大致可以分为四类:

  • 图表库
  • 地理库
  • 渲染库
  • 数据驱动框架

图表库

图表库应该是可视化中最常见的东西,比如:柱状图、折线图、饼图等,常见的图表库有:EchartsChartist.jsChart.jsHighCharts 等。

echarts.jpg

地图库

专业的 GIS 地图库是为了绘制复杂的地图而生的,可以在地图上标注交通路线、建筑模型位置、地理区块轮廓等,常见的地图库有:Cesium.jsdeck.glLeaflet.jsMapboxArcGIS 等。

gis.jpg

渲染库

渲染库可以提供绘制更灵活的图形、图形或者物理模型的能力,事实上很多地图库本身就是基于这些渲染库开发的,常用的渲染库有:Babylon.jsSpriteJSThree.js 等。

threejs.jpg

数据驱动框架

数据驱动框架是一种特殊的库,比如:D3.js,它们更专注于处理数据的组织形式,而将数据呈现交给更底层的图形系统(DOM、SVG、Canvas)或通用图形库(SpriteJS、ThreeJS)去完成。

d3.jpg

可视化领域图形绘制方法

Web 上绘制图形的方式可以总结为 4 种:

  • HTML + CSS
  • SVG
  • Canvas2D
  • WebGL

下面分别来说一下这几种方式是如何在 Web 上进行图形绘制的。

HTML + CSS

这是普通网页开发中最传统,也是最常用的图形绘制方式,像常见的柱状图、饼图和折线图等都可以使用这种方式来实现。

柱状图

bar.jpg

饼图

pie.jpg

折线图

line.jpg

HTML + CSS 这种方式的优点是:一些简单的可视化图表,用 CSS 来实现很有好处,既能简化开发,又不需要引入额外的库,可以节省资源,提高网页打开的速度。

但是其缺点也很明显:

  1. 其绘制方式并不简洁,需要使用到网页布局,而且在 CSS 中很难看出数据与图形的对应关系,对于维护来说是比较麻烦的。
  2. HTML 和 CSS 作为浏览器渲染引擎的一部分,为了完成页面渲染的工作,除了绘制图形外,还要做很多额外的工作。比如说,浏览器的渲染引擎在工作时,要先解析 HTML、SVG、CSS,构建 DOM 树、RenderObject 树和 RenderLayer 树,然后用 HTML(或 SVG)绘图。当图形发生变化时,我们很可能要重新执行全部的工作,这样的性能开销是非常大的。而对于可视化来说这些复杂的布局是不必要的,白白消耗了这些性能。

SVG

SVG(Scalable Vector Graphics,可缩放矢量图)是一种基于 XML 语法的图像格式,可以用 img 元素的 src 属性加载。

浏览器内嵌 SVG 标签,并且像操作普通的 HTML 元素一样,利用 DOM API 操作 SVG 元素。甚至,CSS 也可以作用于内嵌的 SVG 元素。

示例

svg.jpg

SVG 与 HTML + CSS 比最大的优势就是他把不规则图形的绘制变得更简单了。

但是,SVG 图表也有和 HTML + CSS 类似的缺点,那就是解析和渲染树生成的开销比较高,所以在图素比较多的时候 SVG 的渲染就会变得很慢,这也注定了 SVG 只适合元素不是那么多的场景。

Canvas2D

Canvas2D 是浏览器提供的一种可以直接用代码在一块平面的“画布”上绘制图形的 API,使用它来绘图更像是传统的“编写代码”,简单来说就是调用绘图指令,然后引擎直接在页面上绘制图形。这是一种指令式的绘图系统。

Canvas 可以直接在画布上进行图形的绘制,不像 HTML + CSS 和 SVG 那么需要重新进行网页渲染那一整套流程,因此其绘图的性能要比 HTML + CSS 和 SVG 高很多。

不过,Canvas 也有一个缺点就是想要控制其画布上的图素的时候会没有那么方便,需要通过一些数据计算进行定位,才能获取局部图形,并与其进行交互。

另外,SVG 可以画入 Canvas 中,这样就既可以享受 SVG 的便利性,有可以享受 Canvas 的高性能了。

示例1

canvas_svg.jpg

示例2

canvas.jpg

WebGL

WebGL(Web Graphic Library),是一种 3D 绘图协议,这种绘图标准允许把 JavaScript 和 OpenGL ES 2.0 结合在一起,通过增加 OpenGL ES 2.0 的一个 JavaScript 绑定,WebGL 可以为 HTML5 Canvas 提供硬件 3D加速渲染,这样 Web 开发人员就可以借助 GPU,在浏览器里更流畅地展示 3D 场景和模型了。WebGL 是由浏览器来支持和实现的。

WebGL 绘制比前三种方式要复杂许多,API 相对更底层,使用起来不如前三种那么简单直接。

一般情况下,Canvas2D 绘制图形的性能已经足够高了,但是在三种情况下我们有必要直接操作更强大的 GPU 来实现绘图:

  1. 需要绘制图形数量非常巨大,而且可能还需要不断地动态更新,Canvas2D 的性能已经达到了瓶颈。这个时候,我们就需要使用 GPU 能力,直接用 WebGL 来绘制。
  2. 需要绘制的图形对细节处理要求比较高,比如:实现物体的光影、流体效果和一些复杂的像素滤镜有像素点,Canvas2D 的性能已经达到了瓶颈,就需要用 WebGL 来绘制。
  3. 绘制 3D 物体。

示例

webgl.jpg

总结

绘图方式优点缺点适用场景
HTML + CSS简单、依赖少、加载快不够直观、不方便开发维护少量简单图形
SVG简单、直观、方便元素多时性能瓶颈比较明显图形较多且图形较复杂
Canvas2D高性能动态绘制直接操作图形元素不方便图形复杂、像素处理元素众多
WebGL3D、大批量绘制、可充分利用 GPU、超高性能使用繁琐、门槛较高图形复杂、像素处理特别多、3D