Skip to content

数据可视化知识点

相关实现方案

GoView低代码数据可视化

DataEase开源数据可视化分析平台

DataV Vue大屏数据展示组件库 好几年没有更新了

大姐大封装的数据可视化组件库

数据可视化解决方案

Image text

Skia

Skia 是 Chrome 和 Android 的底层 2D 绘图引擎。Skia 采用 C++ 编程,由于它位于浏览器的更底层,所以我们平常接触较少

OpenGL

OpenGL(Open Graphics Library)是2D、3D图形渲染库,它可以绘制从简单的2D图形到复杂的3D景象。OpenGL 常用于 CAD、VR、数据可视化和游戏等众多领域。

Chrome

Chrome 使用 Skia 作为绘图引擎,向上层开放了 canvas、svg、WebGL、HTML 等绘图能力

canvas

canvas 是 HTML5 的新特性,它允许我们使用 canvas 元素在网页上通过 JavaScript 绘制图像。

示例:

html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>canvas</title>
</head>
<body>
  <canvas id="canvas" width="500" height="500"></canvas>
  <script>
    const canvas = document.getElementById('canvas') // 获取dom对象
    const ctx = canvas.getContext('2d') // 获取canvas对象
    ctx.fillStyle = 'red'
    ctx.fillRect(0, 0, 50, 50) // 绘制矩形

    ctx.beginPath() // 开始绘制路径
    ctx.lineWidth = 1 // 线条宽度
    ctx.strokeStyle = 'blue' // 线条填充色
    ctx.moveTo(100, 100) // 起点坐标
    ctx.lineTo(250, 75) // 中间点坐标
    ctx.lineTo(300, 100) // 终点坐标
    ctx.stroke() // 绘制线条

    ctx.beginPath();
    ctx.lineWidth = 2;
    ctx.strokeStyle = 'green'; // 圆形边框色
    ctx.fillStyle = 'red'; // 圆形填充色
    ctx.arc(200, 200, 50, 0, 2 * Math.PI); // 绘制圆形
    ctx.stroke(); // 绘制圆形的边框
    ctx.fill(); // 绘制圆形的填充色

    ctx.beginPath();
    ctx.lineWidth = 1;
    ctx.strokeStyle = 'red';
    ctx.moveTo(300, 300);
    ctx.lineTo(301, 301); // 绘制一个点
    ctx.stroke();
  </script>
</body>
</html>

总结canvas绘图的流程:

1、编写 canvas 标签(注意指定宽高)

2、获取 canvas DOM 对象

3、获取 Canvas 对象

4、设置绘图属性

5、调用绘图 API

svg

SVG是一种基于 XML 的图像文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形

示例:

html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<svg width="800" height="800">
  <rect
    width="50"
    height="50"
    style="fill:red;stroke-width:0;stroke:rgb(0,0,0);"
  />
  <line
    x1="100"
    y1="100"
    x2="250"
    y2="75"
    style="stroke:blue;stroke-width:1"
  />
  <line
    x1="250"
    y1="75"
    x2="300"
    y2="100"
    style="stroke:blue;stroke-width:1"
  />
  <circle
    cx="200"
    cy="200"
    r="50"
    stroke="green"
    stroke-width="2"
    fill="red"
  />
  <line
    x1="300"
    y1="300"
    x2="301"
    y2="301"
    style="stroke:red;stroke-width:1"
  />
</svg>
</body>
</html>

总结svg绘图的流程

  • 编写 svg 标签,指定宽高
  • 编写 svg 绘图标签
  • 编写绘图属性和样式

应用场景

  • 绘制icon
  • 绘制动画

viewport、viewBox、preserveAspectRatio

viewport

指svg的可见区域,它的大小可以通过 CSS 或者 HTML 标签属性指定。当SVG渲染时,viewport 就是 SVG 文件外面的那个矩形

viewBox

指SVG内部以坐标系的方式描述的区域,它可以应用在SVG元素中,并会影响当前SVG的坐标系,我们在绘制元素时需要将元素放入一个你定义好的视区中,这就是利用 viewbox 实现的。

示例:

Image text

html
    <svg width="500" height="200" viewBox="0 0 50 20" style="border: 1px solid #000000">
      <rect x="20" y="10" width="10" height="5" style="stroke: #000000; fill:none;"/>
    </svg>

    <svg width="500" height="200" style="border: 1px solid #000000">
      <rect x="200" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
    </svg>

上面这俩种写法的效果是一样的

分析:

svg显示的时候:

1、先计算可视区域宽高与坐标系viewBox宽高的比例:上面第一个例子里:500与50的比例是10,200与20的比例也是10

2、将展示的图形的坐标和宽高按照第一步计算的比例放大

备注

上面的例子,宽高的比例都是10,在实际项目中,宽高各自的比例是不一样的,这就需要用到preserveAspectRatio

preserveAspectRatio

用于当 viewport 和 viewBox 宽高比不相同时,指定这个坐标系在viewport 中是否完全可见,同时也可以指定它在viewport 坐标系统中的位置

  • meet: 以宽高小的为比例,保持宽高比显示,并将viewBox缩放为适合viewport的大小(默认参数)

备注

meet 模式下,svg 将优先采纳压缩比较小的作为最终压缩比

示例1

Image text

html
<svg
  width="500"
  height="200"
  viewBox="0 0 200 200"
  style="border: 1px solid #000000"
  preserveAspectRatio="xMidYMid meet"
>
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>

Image text

分析:

preserveAspectRatio 第一个参数有九个可选值,用来表示视口的对齐方式,以左上角为原点,Min表示靠近原点,Mid表示居中,Max 表示远离原点。

  • xMinYMin

  • xMinYMid

  • xMinYMax

  • xMidYMin

  • xMidYMid

  • xMidYMax

  • xMaxYMin

  • xMaxYMid

  • xMaxYMax

上面的例子里为xMidYMid,表示X和Y轴都是居中

意思是viewBox定义的宽高为200的区域,在宽高为500*200的可视区域的正中,

第二个参数为meet,表示以较小比例作为压缩比,当前例子的宽高压缩比分别为2.5和1,这里选择1,

svg内部定义的图形比例不变,按照定义的在viewBox内显示

示例2

Image text

html
<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMaxYMin meet">
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>

Image text

这个例子里,preserveAspectRatio第一个参数为xMaxYMin,表示x轴离原点最远,y轴离原点最近,其他的都和示例1一样

  • slice: 以宽高大的比例为压缩比,保持宽高比显示,并将所有不在viewport中的viewBox剪裁掉

示例:

Image text

html
<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMidYMid slice">
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>

分析:

Image text

1、preserveAspectRatio第二个参数为slice,以宽高大的为比例,即500/200等于2.5对viewBox进行放大2.5倍,宽高变成500;对rect进行放大2.5倍,宽变成250,高变成125展示图形

2、xMidYMid表示viewBox在viewPort的中间,因为x会变成250,Y也变成250,图形会在viewPort里向右向下偏移250

3、slice会将移到viewPort外面的图形裁剪掉,最终展示上面的结果

  • none: 不保存宽高比。缩放图像适合整个viewbox,可能会发生图像变形

备注

none 模式下,svg 将分别计算 x 和 y 轴的压缩比

示例:

Image text

html
<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="none">
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>

WebGL

WebGL(Web Graphics Library)是一种 3D 绘图协议,WebGL可以为 HTML5 Canvas 提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示 3D 场景和模型了,还能创建复杂的导航和数据视觉化。

案例1:3D 魔方

案例2:化学模型

案例3:3D 地球

案例4:3D 大脑

zrender

zrender是二维绘图引擎,它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器。

示例:

html
<!DOCTYPE html>
<html lang="en">
<head>
  <script src="./zrender.js"></script>
  <title>zrender</title>
</head>
<body>
<div id="container" style="width: 800px;height: 800px;"></div>
<script>
  var zr = zrender.init(document.getElementById('container'));
  var rect = new zrender.Rect({
    shape: {
      x: 0,
      y: 0,
      width: 50,
      height: 50
    },
    style: {
      fill: 'red',
      lineWidth: 0
    }
  });
  var line = new zrender.Polyline({
    shape: {
      points:[
        [100, 100],
        [250, 75],
        [300, 100]
      ]
    },
    style: {
      stroke: 'blue',
      lineWidth: 1
    }
  });
  var circle = new zrender.Circle({
    shape: {
      cx: 200,
      cy: 200,
      r: 50
    },
    style: {
      fill: 'red',
      stroke: 'green',
      lineWidth: 2
    }
  });
  var point = new zrender.Polyline({
    shape: {
      points:[
        [300, 300],
        [301, 301]
      ]
    },
    style: {
      stroke: 'red',
      lineWidth: 1
    }
  });
  zr.add(rect);
  zr.add(line);
  zr.add(circle);
  zr.add(point);
</script>
</body>
</html>

总结zrender绘图的流程:

1、引入 zrender 库

2、编写 div 容器

3、初始化 zrender 对象

4、初始化 zrender 绘图对象

5、调用 zrender add 方法绘图

D3

D3(Data-Driven Documents) 是一个 Javascript 图形库,基于 Canvas、Svg 和 HTML。

D3的案例

Three.js

Three.js是一个基于 WebGL 的 Javascript 3D 图形库

Highcharts

[Highcharts}(https://www.highcharts.com.cn/)是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,Highcharts 支持的图表类型有直线图、曲线图、区域图、柱状图、饼状图、散状点图、仪表图、气泡图、瀑布流图等多达 20 种图表

Highcharts 系列包含 Highcharts JS,Highstock JS,Highmaps JS 共三款软件,均为纯 JavaScript 编写的 HTML5 图表库

AntV

AntV是蚂蚁金服全新一代数据可视化解决方案,致力于提供一套简单方便、专业可靠、无限可能的数据可视化最佳实践。

AntV 包括以下解决方案:

  • G2:可视化引擎

  • G2Plot:图表库

  • G6:图可视化引擎

  • Graphin:基于 G6 的图分析组件

  • F2:移动可视化方案

  • ChartCube:AntV 图表在线制作

  • L7:地理空间数据可视化

数据可视化实现方案

上面的数据可视化解决方案罗列了很多,有的是规范,比如WebGl;有的是规范上的实现,比如Three.js就是WevGl的实现。

总结起来就四种:HTML+CSS、SVG、Canvas2D、WebGL

HTML+CSS

HTML+CSS 的优点是方便,不需要第三方依赖,甚至不需要 JavaScript 代码。如果我们要绘制少量常见的图表,可以直接采用 HTML 和 CSS。它的缺点是 CSS 属性不能直观体现数据,绘制起来也相对麻烦,图形复杂会导致 HTML 元素多,而消耗性能。

浏览器的渲染引擎在工作时,要先解析 HTML、SVG、CSS,构建 DOM 树、RenderObject 树和 RenderLayer 树,然后用 HTML(或 SVG)绘图。当图形发生变化时,我们很可能要重新执行全部的工作,这样的性能开销是非常大的。

饼图:

Image text

html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    .piegraph { display: inline-block; width: 250px; height: 250px; border-radius: 50%; background-image: conic-gradient(#37c 30deg, #3c7 30deg, #3c7 65deg, orange 65deg, orange 110deg, #f73 110deg, #f73 200deg, #ccc 200deg);}
  </style>
</head>
<body>
<div class="piegraph"></div>
</body>
</html>

SVG

SVG 是对 HTML/CSS 的增强,弥补了 HTML 绘制不规则图形的能力。它通过属性设置图形,可以直观地体现数据,使用起来非常方便。但是 SVG 也有和 HTML/CSS 同样的问题,图形复杂时需要的 SVG 元素太多,也非常消耗性能。

Canvas2D

Canvas2D 是浏览器提供的简便快捷的指令式图形系统,它通过一些简单的指令就能快速绘制出复杂的图形。由于它直接操作绘图上下文,因此没有 HTML/CSS 和 SVG 绘图因为元素多导致消耗性能的问题,性能要比前两者快得多。但是如果要绘制的图形太多,或者处理大量的像素计算时,Canvas2D 依然会遇到性能瓶颈。

备注

现在浏览器的canvas一般有webgl2webgl2d三种上下文。它们并不是一个完整的canvas api规范,而是分成了2d规范和webgl规范。webgl规范是opengl es规范在web端的实现,其中webgl2对应opengl es 3.0,而webgl对应的是opengl es 2.0

平时我们开发图表用的canvas主要是指Canvas2D

无论是使用 HTML/CSS 还是 SVG,它们都属于声明式绘图系统,也就是我们根据数据创建各种不同的图形元素(或者 CSS 规则),然后利用浏览器渲染引擎解析它们并渲染出来。

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

Canvas 和 SVG 的使用也不是非此即彼的,它们可以结合使用。因为 SVG 作为一种图形格式,也可以作为 image 元素绘制到 Canvas 中。

举个例子,我们可以先使用 SVG 生成某些图形,然后用 Canvas 来渲染。这样,我们就既可以享受 SVG 的便利性,又可以享受 Canvas 的高性能了。

WebGL

WebGL 是浏览器提供的功能强大的绘图系统,它使用比较复杂,但是功能强大,能够充分利用 GPU 并行计算的能力,来快速、精准地操作图像的像素,在同一时间完成数十万或数百万次计算。

另外,它还内置了对 3D 物体的投影、深度检测等处理,这让它更适合绘制 3D 场景

技术选型

ECharts VS Highcharts

Highcharts 和 ECharts 的争论非常多,整体来说:

  • Highcharts 能够兼容 IE6+,ECharts 通过 VML 兼容低端浏览器

  • Highcharts 文档体验略胜一筹

  • Highcharts 收费,这是很多开发者转向 ECharts 的主要原因

  • Highcharts 基于 svg 实现,ECharts 默认采用 canvas 渲染,4.0 支持 svg 渲染

  • ECharts 国内知名度更高,国内企业认可度更高

ECharts VS AntV

  • AntV 文档阅读体验更符合互联网产品使用习惯

  • AntV 产品体系拆分更加清晰,但一定程度上提升了学习成本

  • ECharts 社区更强大

  • ECharts 使用更加广泛

参考文章

跟月影学可视化

如有转载或 CV 的请标注本站原文地址