Skip to content

Latest commit

 

History

History
403 lines (280 loc) · 11.2 KB

数据可视化.md

File metadata and controls

403 lines (280 loc) · 11.2 KB

数据可视化

可下载 github/data-view 相关代码来辅助了解。

1、canvas

1.1、为什么要学canvas?

canvas 可以绘制复杂图形,处理图像,做动画,开发游戏,处理视频...

比如:我们平常用div+css 只能做一些简单的图形,如:正方形,长方形,圆,椭圆...... 但是用canvas 可以制作,三角形、多边形,花瓣......

1.2、canvas 是什么?

MDN 中是这样定义 <canvas> 的:

<canvas> 是 HTML5 新增的元素,可用于通过使用 JavaScript 中的脚本来绘制图形。例如,它可以用于绘制图形、制作照片、创建动画,甚至可以进行实时视频处理或渲染。

这里需要划重点的是,<canvas> 只是一个画布,本身并不具有绘图的能力,绘图必须使用 JavaScript 等脚本语言。

<canvas> 标签允许脚本语言动态渲染位图像。<canvas> 标签创建出了一个可绘制区域,JavaScript 代码可以通过一套完整的绘图功能类似于其他通用二维的 API 访问该区域,从而生成动态的图形。

我们可以认为 <canvas> 标签只是一个矩形的画布。JavaScript 就是画笔,负责在画布上画画。

广义上:就是 H5 新增的canvas 2d绘图功能

在html中:canvas 是html标签(具有标签属性了);canvas可以理解为一张画布;用js 在canvas 里绘制图形。

1.3、设置canvas 尺寸

设置 canvas dom元素的 width、height 属性

⚠️ 注意:不要使用css 设置 canvas 尺寸

#canvas{
  background-color: aliceblue;
}
<canvas id="canvas" width="300" height="500"></canvas>  
// 画布
const canvas= document.getElementById("canvas");
canvas.width = 200;
canvas.height = 100;

上处这些代码就可以看到一个画布了,并设置了其尺寸大小。

1.4、canvas 上下文对象

获取上下文对象的方法:canvas.getContext('2d')

 // 画笔
const ctx = canvas.getContext('2d')
ctx.fillRect(100,200,300,400) // x,y,w,h

1.5、图形的绘图形式

1.5.1、矩形

矩形的绘制方法:

  • 填充矩形方法:fillRect(x,y,w,h)
  • 描边矩形方法:stokeRect(x,y,w,h)
  • ​清理矩形方法:clearRect(x,y,w,h)
// 填充矩形
ctx.fillRect(100,100,100,100) // x,y,w,h
// 颜色
ctx.strokeStyle = 'red'
// 线宽
ctx.lineWidth = 5
// 描边矩形
ctx.strokeRect(100,100,100,100)
// 清理矩形
ctx.clearRect(100,100,100,100)
// 清理画布
ctx.clearRect(0,0,canvas.width,canvas.height)

1.5.2、路径

绘制路径步骤:

​1、开始建立路径:beginPath() ​2、向路径集合中添加子路径。 ​3、显示路径:填充fill(); 描边stroke()

子路径的形状:

  • 直线:lineTo(x,y); lineTo(x,y); lineTo(x,y)
  • 圆弧:arc(x,y,半径,开始弧度,结束弧度,方向)
  • 切线圆弧:arcTo(x1,y1,x2,y2,半径)
  • 二次贝塞尔曲线:quadraticCurveTo(x1, y1, x, y); (从上一点开始绘制一条二次曲线,到(x, y)为止,并且以(x1, y1)作为控制点)
  • 三次贝塞尔曲线:bezierCurveTo(x1, y1, x2, y2, x, y) (从上一个点开始绘制一条曲线,到(x, y)为止,并且以(x1, y1)和(x2, y2)为控制点) ​* 矩形:rect(x,y,w.h)

1.5.3、图形的着色区域

图形的着色区域有两种:

​1、描边区域:strokeStyle ​2、填充区域:fillStyle

1.5.4、文本的绘制

文本的绘制方法有两种:

​1、描边文字:strokeText(text,x,y,maxWidth) ​2、填充文字:fillText(text,x,y,maxWidth)

获取文字的宽度方法:measureText(text)

设置font字体:ctx.font = 'bold 20px serif' // 粗细、大小、字体

textAlign 水平对齐 // start left end right center

Textbaseline 垂直对齐 // top middle bottom hanging(悬挂基线对齐) ideographic(表意基线对齐)

1.5.5、状态管理

状态管理,管理的是上下文对象的状态。

上下文对象的状态就是上下文对象的属性。比如:秒变颜色,填充颜色,投影,线条样式...

管理上下文状态的方法有两个:

  • 保存当前状态:save()
  • 恢复上一次保存的状态:restore()

绘制具备同一种样式的图形时,都会save(),restore() 将其包裹起来,这是为了避免当前的图形样式影响后边要绘制的图形样式。

1.5.6、图形选择

canvas 图形没有监听事件的方法。

比如用鼠标选择图形时,只能用canvas画布监听事件,获取鼠标或触摸点在canvas中的位置,再基于图形再canvas中的位置和形状,判断鼠标在canvas中的点位是否在图形中。

扇形选择必备条件:

  • 圆心位置:center
  • 半径:radius
  • 起始弧度:startAngle
  • 结束弧度:endAngl

1.6、饼图

饼图主要用于展现不同数据在总数中的占比。

扇形的弧长表示该类别的占比大小,也就是多个扇形组成了饼图。

饼图的核心内容:

  • 扇形
  • 引导线+标签文字
  • 提示框
  • 鼠标划入划出的事件

扇形结构介绍

已知: *以圆心pos为起点,做一条射线将扇形均分,点p1在这条射线上。 *p1到圆心的距离比半径长20 求:点p1 的位置 x, y 定理:根据向量的方向和长度,可求点位 解: 方向 = (结束弧度-起始弧度)/2+起始弧度 长度 = 半径+20 x = Math.cos(方向)*长度 + pos.x y = Math.sin(方向)*长度 + pos.y

哈哈,大家还记得三角函数公式吗?!

1.6.1、饼图动效

饼图动画:

  • 弹性动画
  • 缓动跟随

制作动画的业务逻辑:

​1、初始状态0:扇形由小变大,弹性运动 ​2、鼠标划入1:扇形扩大一点,弹性运动;提示缓动跟随 ​3、鼠标划出2:扇形缩小一点,弹性运动;提示隐藏

1.6.2、饼图二分法

二分法就是一分为二的方法。

1.6.3、饼图完整版

绘制饼图步骤:

​1、声明必备数据 ​2、构建数据 ​3、基于数据绘图 ​4、鼠标交互

1.7、canvas 总结

其实 canvas 精彩的地方就在于 程序算法 和 艺术 的结合。也就是说它可以用逻辑算法来展示艺术中美的规律。

喜欢、感兴趣的小伙伴 可以深入研究canvas,It's amazing !应用场景广泛:绘制图表(ECharts)、小游戏(H5游戏)、活动页面(转盘、刮刮乐)、小特效、炫酷背景.....

2、echarts

一个基于 JavaScript 的开源可视化图表库,关于echarts的功能和特性可以移步官网了解

官网也有快速入门等教程文档帮助我们使用echarts。

2.1、echarts常用组件

echarts 常用组件:

  • 标题 title
  • 图例 legend
  • 工具栏 toolbox
  • 提示框 tooltip
  • 坐标轴 xAxis yAxis
  • 系列列表 series

2.2、echarts常用图表

echarts 常用图表:

  • 折线图 line
  • 柱状图 bar
  • 饼图 pie
  • 散点图 scatter
  • k线图 candlestick
  • 雷达 radar
  • 仪表盘 gauge

2.3、echarts数据集dataset

dataset数据集组件是从echarts4开始有的,用于数据管理。

dataset的优点:

  • 基于原始数据,设置映射关系,形成图表
  • 数据和配置分离,便于单独管理
  • 数据可以被多个系列或者组件复用
  • 支持更多的数据的常用格式,例如二维数组、对象数组等

2.3.1、数据集与图表的映射方式

  • 第1列映射类目轴
  • 第2列第1个系列
  • 第3列第2个系列
  • ...
// 指定图表的配置项和数据
const option = {
  legend: {},
  tooltip: {},
  dataset: {
    // 提供一份数据。
    source: [
      ['product', '2015', '2016', '2017'],
      ['Latte', 43.3, 85.8, 93.7],
      ['Tea', 83.1, 73.4, 55.1],
      ['Cocoa', 86.4, 65.2, 82.5],
      ['Brownie', 72.4, 53.9, 39.1]
    ]
  },
  // X 轴,类目轴(category)。默认情况下,类目轴对应到 dataset 第一列。
  xAxis: {type: 'category'},
  // Y 轴,数值轴。
  yAxis: {},
  // 多个 bar 系列,默认情况下,每个系列会自动对应到 dataset 的每一列。
  series: [
    {type: 'bar'},
    {type: 'bar'},
    {type: 'bar'}
  ]
};

或者也可以使用常见的对象数组的格式:

// 指定图表的配置项和数据
const option = {
  legend: {},
  tooltip: {},
  dataset: {
    // 这里指定了维度名的顺序,从而可以利用默认的维度到坐标轴的映射。
    // 如果不指定 dimensions,也可以通过指定 series.encode 完成映射
    dimensions: ['product', '2015', '2016', '2017'],
    source: [
      {product: 'Latte', '2015': 43.3, '2016': 85.8, '2017': 93.7},
      {product: 'Tea', '2015': 83.1, '2016': 73.4, '2017': 55.1},
      {product: 'Cocoa', '2015': 86.4, '2016': 65.2, '2017': 82.5},
      {product: 'Brownie', '2015': 72.4, '2016': 53.9, '2017': 39.1}
    ]
  },
  xAxis: {type: 'category'},
  yAxis: {},
  series: [
    {type: 'bar'},
    {type: 'bar'},
    {type: 'bar'}
  ]
};

2.3.2、数据集的行列映射

基于列映射:

serieslayoutBy: colum, 

// x轴 就是 Latte、Tea、Cocoa、Brownie
dataset: {
  source: [
    ['product', '2015', '2016', '2017'],
    ['Latte', 43.3, 85.8, 93.7],
    ['Tea', 83.1, 73.4, 55.1],
    ['Cocoa', 86.4, 65.2, 82.5],
    ['Brownie', 72.4, 53.9, 39.1]
  ]
},

基于行映射:

serieslayoutBy: row, 

// x轴 就是 '2015', '2016', '2017'
dataset: {
  source: [
    ['product', '2015', '2016', '2017'],
    ['Latte', 43.3, 85.8, 93.7],
    ['Tea', 83.1, 73.4, 55.1],
    ['Cocoa', 86.4, 65.2, 82.5],
    ['Brownie', 72.4, 53.9, 39.1]
  ]
},

2.4、echarts中的样式设置

echarts 的样式设置方法有以下几种:

  • 颜色主题 (theme)
  • 调色盘(color)
  • 具体样式设置(itemStyle、lineStyle、areaStyle、label...)
  • 视觉映射(visualMap)

2.4.1、颜色主题(theme)

颜色主题就是修改全局样式的方法。

echarts 内置了两套主题,分别为 lightdark,其设置方法为:

echarts.init(dom, 'light’)

若要使用其它主题,需要去主题下载

3、large screen

大屏通俗的讲就是显示在大屏幕的网页,我们做数据可视化的,对于我们来说也是常见的。

大屏通常放在公共空间中、或者显眼的地方展示数据。

大屏的尺寸设计一般是 1920*1080,可以不用考虑浏览器的兼容性,只要谷歌浏览器能兼容就行。

大屏的制作原理是在页面中,建立多个echarts 容器,将不同的echarts 图表放入其中。

3.1、large screen的自适应

大屏在自适应屏幕时要考虑两个方面:

1、echarts 容器对屏幕尺寸的自适应。

  • css 基础知识,如flex布局、百分比定位等……

2、echarts 图表对容器尺寸的自适应。

  • 图表元素百分比定位,如left:‘20%’
  • 使用echarts的media 功能进行响应式布局。

注:echarts 实例的 resize() 方法,可以在在容器大小发生改变时,改变图表尺寸。

3.2、large screen的常见布局

大屏布局2

大屏布局2