关于 数据可视化、Canvas

一、数据可视化

1数据可视化概述

数据可视化Data Visualization:就是指将结构或非结构数据转换成适当的可视化图表,然后将隐藏在数据中的信息直接展现于人们面前。

2应用场景

数据报表 特效制作 游戏开发 大屏展示

大屏展示目前在web前端开发中占比比较多,使用场景如下:

(1)媒体大屏
    适合展会、媒体访问等公众场合,是企业形象、品牌展示的窗口;
(2)接待大屏
    适用企业内部宣传专区,用于接待来访领导、客户或投资。
(3)监控大屏
    针对企业运营或运维监控需求,比较适用内部指挥监控等;
(4)科技大屏
    滴滴出行大数据、天猫双十一交易数据、茅台数博会大屏等;

3数据可视化工具

3.1绘图容器(画布)

canvas svg

3.2绘图工具(插件)

echarts highcharts charts d3 ucharts

4工具的区别

1.Canvas和SVG的区别
    Canvas:
        (1)依赖分辨率,都是标量图形
        (2)不支持事件处理器(不能绑定事件)
        (3)弱的文本渲染能力,适合游戏开发(微信小游戏)
        (4)能够以 .png 或 .jpg 格式保存结果图像
    SVG:
        (1)不依赖分辨率,矢量图形
        (2)支持事件处理器
        (3)最适合带有大型渲染区域的应用程序(比如谷歌地图)
        (4)不适合游戏应用
​
2.Echarts.js、D3.js、Highcharts.js的区别
    Echarts.js:
        百度商业前端数据可视化团队研发的图表库,免费开源,国内用户偏多。可以使用canvas和svg绘制图形
    Highcharts.js:
        highcharts是国外的一家公司开发的图表库,主要采用svg画图。
    D3.js:
        D3通过svg来绘制图形,偏底层,太底层,学习成本大。
    总结:  
        Echarts类似于中国的WPS,而HightCharts类似于微软的office,D3更适合交互类图表。

二、认识Canvas

1Canvas概述

Canvas标签用于绘制图形的 HTML 元素,canvas元素本身并没有绘制能力,它仅仅是图形的容器,通常通过JavaScript脚本进行绘制。canvas最早由Apple引入WebKit,用于MacOSX的Dashboard,随后被各个浏览器实现。如今,所有主流的浏览器都支持它。

2应用场景

适合游戏应用

微信小游戏

数据可视化图形

各种图表

h5端特效

3canvas标签

1.画布大小

canvas默认大小是300(宽)*150(高),单位是px;不要使用style样式的方式设置其大小否则会导致变化内部图形变形,使用起内部的width和height属性来设置其大小;canvas元素默认被网格所覆盖。通常来说网格中的一个单元相当于canvas元素中的一像素。

2.画布坐标

栅格的起点为左上角[坐标为(0,0)]所有元素的位置都相对于原点定位。

4canvas上下文对象

因为canvas本身不具备绘图能力,所以需要其内部的2d画笔对象来完成图形绘制,也就是canvas上下文对象,后面我们可以称其为画笔;

let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');

5浏览器支持性

Internet Explorer 9、Firefox、Opera、Chrome 以及 Safari 支持 <canvas> 及其属性和方法。 注释:Internet Explorer 8 以及更早的版本不支持 <canvas> 元素。

6canvas兼容性处理

1.检查文本替换

<canvas id="canvas" width="500" height="500">暂不支持请更换浏览器!</canvas>

2.检查编程支持性

if(canvas.getContext){
        // 获取canvas上下文对象(画笔)
        let ctx = canvas.getContext('2d');
        // console.log(ctx);
 }else{
        alert('暂不支持请更换浏览器')
}

三、绘制线段

1.线条相关属性及方法

moveTo(x,y)    把路径移动到画布中的指定点,不创建线条。
lineTo(x,y)     添加一个新点,绘制一条从当前位置到指定新点(x,y)位置的直线。
strokeStyle    设置或返回描边颜色
fillStyle       设置或返回填充颜色
stroke()       描边已定义绘图(路径)
fill()         填充当前绘图(路径)
lineWidth     设置或返回当前的线条宽度
lineJoin设置或返回两条线相交时,所创建的拐角类型 //bevel:创建斜角   round:创建圆角。
lineCap设置或返回线条的结束端点样式  //round:添加圆角   square:添加矩形  butt:默认
			// 1.绘制一条直线
			// ctx.moveTo(20,20);//设置起点
			// ctx.lineTo(490,20);//设置下一个点并且连接上一个点
			// ctx.lineWidth=20;//设置线段的宽度
			// ctx.strokeStyle='red';//设置描边颜色
			// ctx.lineCap='square';//设置线段两侧风格
			// ctx.stroke();//设置描边
			// ctx.fill();//填充线段(没有填充)
			
			
			// 2.绘制两条垂直相交线段
			// ctx.moveTo(20,20);
			// ctx.lineTo(200,20);
			// ctx.lineTo(200,200);
			// ctx.lineWidth=20;
			// ctx.lineJoin='round';//设置拐进类型
			// ctx.stroke();
			
			
			// 3.绘制描边矩形
			// ctx.moveTo(20,20);
			// ctx.lineTo(200,20);
			// ctx.lineTo(200,200);
			// ctx.lineTo(20,200);
			// ctx.lineTo(20,20);
			// ctx.stroke();
			
			// 4.绘制填充矩形
			// ctx.moveTo(20,20);
			// ctx.lineTo(200,20);
			// ctx.lineTo(200,200);
			// ctx.lineTo(20,200);
			// ctx.fillStyle='red';//设置填充颜色
			// ctx.fill();//设置填充
			// ctx.strokeStyle='green';
			// ctx.lineWidth=10;
			// ctx.stroke();

2.绘制路径

beginPath()  新建一条路径,生成之后,图形绘制命令被指向到路径上生成新路径。可以防止后面绘制的图形样式作用域前面已经绘制的图形。如果不使用此方法,那么绘制的所有图形都将在一条路径上。

closePath() 作用是闭合路径,将当前路径上的起点和结束位置进行闭合连接,一般用于闭合多边形,不是结束路径,不是必需的,和beginpath()没有任何关系;
			// ctx.moveTo(20,20);
			// ctx.lineTo(200,20);
			// ctx.lineWidth=10;
			// ctx.stroke();
			
			// ctx.beginPath();//开启新的路径
			// ctx.moveTo(20,50);
			// ctx.lineTo(200,50);
			// ctx.lineWidth=1;
			// ctx.strokeStyle='red';
			// ctx.stroke();	
            
            
            // ctx.moveTo(20,20);
			// ctx.lineTo(200,20);
			// ctx.lineTo(200,200);
			// ctx.lineTo(20,200);
			// ctx.lineTo(20,20);
			// ctx.closePath();//闭合路径(将起点和重点连接闭合)
			// ctx.stroke();

四、绘制图形

1绘制矩形

1.线段绘制
2.rect()方法
3.fillRect()直接填充绘制方法
4.strokeRect()直接描边绘制方法
5.clearRect()清除矩形大小
			// 1.线段绘制法
			// 2.rect()方法
			// ctx.rect(100,100,100,100);//设置矩形的坐标和大小
			// ctx.fill();
			// ctx.strokeStyle='red';
			// ctx.stroke();
			
			// 3.fillRect()直接填充绘制方法
			// ctx.fillStyle='red';
			// ctx.fillRect(100,100,200,200);
			
			
			// 4.strokeRect()直接描边绘制方法
			// ctx.lineWidth=10;
			// ctx.strokeStyle='red';
			// ctx.strokeRect(100,100,200,200)
			
			
			// 5.clearRect()清除矩形大小
			// ctx.fillRect(100,100,200,200);
			// ctx.clearRect(120,120,50,50);//擦除矩形大小空间
			// ctx.clearRect(0,0,500,500);//擦除整个画布空间大小			

2绘制圆形

ctx.arc(x,y,r,startAng,endAng,bool(默认是false:顺时针))

代码实例

			// ctx.arc(x,y,r,startAng(开始弧度),endAng(重点弧度),bool(默认是false:顺时针))
			
			// Math.PI == π == 180度对应的弧度 == 3.14
			// console.log(Math.PI);
			// 0  0
			// 90 Math.PI/2
			// 180 Math.PI
			// 270 Math.PI*1.5
			// 360 Math.PI * 2
			// 每一度对应的弧度:Math.PI/180 
			
			// 1.绘制一个整圆
			// ctx.arc(250,250,200,0,Math.PI*2);
			// ctx.stroke();
			
			// 2.绘制右半圆(顺时针)
			// ctx.arc(250,250,200,Math.PI*1.5,Math.PI*0.5);
			// ctx.closePath();//闭合路径(起点和终点弧度)
			// ctx.stroke();
			
			// 3.绘制左半圆(逆时针)
			// ctx.arc(250,250,200,Math.PI*1.5,Math.PI*0.5,true);
			// ctx.closePath();//闭合路径(起点和终点弧度)
			// ctx.stroke();
			
			// 4.绘制右侧1/4扇形(顺时针)
			// ctx.moveTo(250,250);//设置起点(圆的圆形坐标点)
			// ctx.arc(250,250,200,0,Math.PI*0.5);
			// ctx.closePath();//闭合路径(起点和终点弧度)
			// ctx.stroke();	

五、绘制太极图

六、绘制文本

1.fillText() 填充文本
2.strokeText() 描边文本
3.ctx.textAlign 水平对齐 left  center  right
4.ctx.textBaseline 垂直基线对齐  middle  top  bottom

实例代码

		// 绘制一条水平参考线
			// ctx.moveTo(100,100)
			// ctx.lineTo(400,100)
			// ctx.stroke();
			
			// 1.填充文本
			// ctx.font='50px 黑体';//设置字体大小和类型
			// ctx.textAlign='left';//水平对齐
			// ctx.textBaseline='middle';//设置垂直对齐
			// ctx.fillStyle='red';
			// ctx.fillText('hello',100,100)//设置填充内容和坐标
			
			// 2.填充文本
			// ctx.font='50px 黑体';//设置字体大小和类型
			// ctx.textAlign='left';//水平对齐
			// ctx.textBaseline='middle';//设置垂直对齐
			// ctx.strokeStyle='green';
			// ctx.strokeText('world',300,100)//设置填充内容和坐标

七、绘制图像

drawImage() 方法在画布上绘制图像;
三个参数:
context.drawImage(img,x,y);
五个参数:
context.drawImage(img,x,y,width,height);
九个参数:
context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

实例代码

			// ctx.drawImage() 方法在画布上绘制图像;
			// 获取图片对象
			// let img = new Image();
			// // 赋值图片资源路径
			// img.src='./分帧/fz.jpg';
			// // 将图片绘制到画布上(当图片资源加载成功后)
			// img.οnlοad=()=>{
			// 	ctx.drawImage(img,50,100,400,200);
			// };
			
			// 模拟分帧动画
			// let img = new Image();
			// let index = 1;
			// setInterval(()=>{
			// 	img.src='./分帧/fz'+index+'.png';
			// 	index++;
			// 	if(index >6)index=1;
			// 	img.οnlοad=()=>{
			// 		ctx.drawImage(img,50,100,400,200);
			// 	}
			// },50)

八、渐变

1渐变概述

渐变是一种有规律性的变化,渐变色是指某个物体的颜色从明到暗,或由深转浅,或是从一个色彩缓慢过渡到另一个色彩。
渐变需要两种以上颜色

2渐变的使用场景

处理图表、处理文字、处理图片、用做背景;

3线性渐变

createLinearGradient线性渐变。
1.获取线性渐变对象
	let linear = cxt.createLinearGradient(x1,y1,x2,y2)
    线性渐变开始位置: x1,y1  结束位置:x2,y2,渐变位置坐标点相对于画布而言的
        
2.创建渐变颜色
	addColorStop(0-1,'css')
	第一个参数:渐变的开始位置 ,表示渐变的开始点和结束点之间的一部分。offset 为 0 对应开始点,offset 		为 1 对应结束点
	第二个参数是渐变的颜色

代码案例

			//1. 角形渐变 x1!=x2 y1!=y2
			// let linear = ctx.createLinearGradient(0,0,200,200);
			// 水平渐变 x1!=x2 y1==y2
			// let linear = ctx.createLinearGradient(0,0,200,0);
			// 垂直渐变 x1==x2 y1!=y2
			// let linear = ctx.createLinearGradient(0,0,0,200);
			
			// linear.addColorStop(0.2,'red')
			// linear.addColorStop(0.5,'green')
			// linear.addColorStop(0.8,'orange')
			// linear.addColorStop(1,'blue')
			
			//2. 使用渐变
			// ctx.fillStyle = linear;
			// ctx.fillRect(0,0,200,200)	

4放射性渐变

createRadialGradient放射性渐变。
1.获取线性渐变对象
	let radial = cxt.createRadialGradient(外x,外y,外r,内x,y,内r)
2.创建渐变颜色
	radial.addColorStop()

代码案例

			// let radial = ctx.createRadialGradient(250,250,200,200,200,10);
			// radial.addColorStop(0.2,'red')
			// radial.addColorStop(0.5,'green')
			// radial.addColorStop(0.8,'orange')
			// radial.addColorStop(1,'blue')
			
			// 使用径向渐变
			// ctx.arc(250,250,200,0,Math.PI*2);
			// ctx.fillStyle=radial;
			// ctx.fill();			

九、变形

1旋转rotate

ctx.rotate(旋转的弧度) 是相对于画布的起点进行旋转

			// ctx.fillRect(100,100,100,100);
			
			// 执行旋转30度 转换成弧度
			// ctx.rotate(Math.PI/180*30);
			
			// 再次绘制红色矩形
			// ctx.beginPath();
			// ctx.fillStyle='red';
			// ctx.fillRect(100,100,100,100);	

2移动translate

ctx.translate(x,y) 是将画布的起点进行位移

			// ctx.fillRect(100,100,100,100);
			
			// 执行位移
			// ctx.translate(100,100)
			
			// 再次绘制红色矩形
			// ctx.beginPath();
			// ctx.fillStyle='red';
			// ctx.fillRect(100,100,100,100);	

3.缩放scale

ctx.scale(x,y) 增减图形在 canvas 中的像素数目,scale方法接受两个参数。x,y 分别是横轴和纵轴的缩放因子;

默认情况下,canvas 的 1 单位就是 1 个像素。举例说,如果我们设置缩放因子是 0.5,1 个单位就变成对应 0.5 个像素,这样绘制出来的形状就会是原先的一半。同理,设置为 2.0 时,1 个单位就对应变成了 2 像素,绘制的结果就是图形放大了 2 倍。

			// ctx.fillRect(100,100,100,100);
			
			// 执行缩放
			// ctx.scale(2,2)
			
			// 再次绘制红色矩形
			// ctx.beginPath();
			// ctx.fillStyle='red';
			// ctx.fillRect(100,100,100,100);		
			// 增减图形在 `canvas` 中的像素数目,
			// `scale`方法接受两个参数。`x,y` 分别是横轴和纵轴的缩放因子;
			//  默认情况下,`canvas` 的 1 单位就是 1 个像素。
			
			// ctx.fillRect(100,100,100,100);
			
			// 执行缩放
			// ctx.scale(2,2);
			
			// 再次绘制同样大小矩形
			// ctx.beginPath();
			// ctx.fillStyle='red';
			// ctx.fillRect(100,100,100,100)

4Canvas状态

ctx.save() ctx.restore()

			// 起点(0,0)
			// ctx.fillRect(100,100,100,100);
			
			// 保存状态(0,0)
			// ctx.save();
			
			// 执行位移
			// ctx.translate(100,100);
			
			// 再次绘制同样大小矩形 起点(100,100)
			// ctx.beginPath();
			// ctx.fillStyle='red';
			// ctx.fillRect(100,100,100,100)
			
			// 回复状态 (0,0)
			// ctx.restore();
			
			// 再次绘制同样大小矩形 起点(0,0)
			// ctx.beginPath();
			// ctx.fillStyle='green';
			// ctx.fillRect(100,100,50,50)

5变形transform

transform() 变形矩阵,该方法的行为相对于由 rotate()、scale()、translate() 完成的变换。

ctx.transform(1,0,0,1,0,0)

ctx.transform(a,b,c,d,e,f)

a:水平缩放,b:水平旋转(0,1),c:垂直旋转(0,-1),d:垂直缩放,e:水平移动,f:垂直移动

			ctx.fillRect(100,100,100,100);
			// 执行位移
			ctx.transform(1,-0.5,0.5,1,100,100);
			
			ctx.beginPath();
			ctx.fillStyle='blue';
			ctx.fillRect(100,100,100,100); 

猜你喜欢

转载自blog.csdn.net/qq_48469083/article/details/121798711