一、上篇知识点总结
数据可视化常用工具
容器:canvas svg
插件:echarts highcharts charts d3
canvas标签
大小:300*150 单位px
坐标:起点左上角
canvas画图
画笔:canvas.getContext('2d');
绘制线段:moveTo() lineTo() strokeStyle stroke() fillStyle fill() lineWidth...
绘制矩形:rect() fillRect() strokeRect() clearRect()
绘制圆形:arc(x,y,r,startAng,endAng,bool) Math.PI(180) == π == 3.14
绘制文字:font fillText() strokeText() textAlign ....
绘制图片 drawImage() onload
canvas渐变
线性渐变:linearGradient(x1,y1,x2,y2)
径向渐变:radialGradient(cx1,cy1,r1,cx2,cy2,r2)
canvas变形
rotate(弧度) translate() scale() transform()
canvas状态保存和恢复
save() restore()
三、SVG(了解)
1svg概述
(1)SVG,Scalable Vector Graphics是一种基于XML的语言,用于定义基于矢量的图形,提供了很多绘图的标签。 (2)作为矢量图像,SVG图像永远不会丢失质量,无论它们如何缩小或调整大小。 (3)SVG图像支持交互和动画。
2 svg容器
2.1大小
默认大小也是300*150 单位px 可以通过width和height属性设置其大小或者css方式调整大小
2.2坐标
坐标同canvas,起点默认在画布的左上
3绘制基本图形
1.<rect> 绘制矩形
x,y 矩形绘制的起始位置、 width,height 矩形的宽高、fill颜色值 填充、stroke="颜色" 描边
stroke-width 线宽 、rx,ry 圆角大小
2.<circle> 圆形
cx,cy,r 圆心和半径
3.<line> 线
x1,y1 起始点 、 x2,y2 终点
4.<polyline> 折线
points 集合
="x1,y1 x2,y2 x3,y3 ..."
="x1 y1,x2 y2,..."
5.<path> 路径
d 路径数据
M = moveto
L = lineto
Z = closepath
.....
常用于绘制折线图 面积图
<path
d="M0 0 L200 200 L0 200 z"
fill="none"
stroke="red"
/>
6.<text> 文本
x="100"
y="100"
font-size="50"
fill="red"
font-family="宋体"
水平对齐:text-anchor:start middle end
垂直基线对齐:dominant-baseline:text-after-edge middle text-before-edge
代码案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>svg</title>
<style type="text/css">
svg{background-color: #DDD;}
/* rect{fill:green} */
</style>
</head>
<body>
<!-- 大小:300*150(px) css -->
<svg width='500' height='500'>
<!-- 1.绘制矩形 柱状图 -->
<!-- <rect
x='100'
y='100'
width='100'
height='100'
fill='red'
stroke-width='5'
stroke='red'
transform='rotate(40)'
></rect> -->
<!-- 2.绘制圆形 图形标记 -->
<!-- <circle
cx='250'
cy='250'
r='200'
fill='red'
></circle> -->
<!-- 3.绘制线段 指引线 -->
<!-- <line
x1='20'
y1='20'
x2='200'
y2='20'
stroke='red'
></line> -->
<!-- 4.绘制折线 polyline 绘制折线图 -->
<!-- <polyline
points='50,100 200,200 250,150 300,250'
fill='none'
stroke='red'
></polyline> -->
<!-- 5.绘制路径 path 折线图 饼图 扇形图 -->
<!-- <path
d="M0 0 L200 200 L0 200 z"
></path> -->
<!-- 6.绘制文字 -->
<!-- 水平对齐:text-anchor:start middle end
垂直基线对齐:dominant-baseline:text-after-edge middle text-before-edge -->
<!-- <line
x1='100'
y1='100'
x2='500'
y2='100'
stroke='red'
></line> -->
<!-- <text
x='100'
y='100'
font-size='50'
font-family="宋体"
text-anchor="start"
dominant-baseline="text-before-edge"
>hello</text>
<text
x='300'
y='100'
font-size='50'
font-family="黑体"
text-anchor="start"
dominant-baseline="text-before-edge"
stroke='red'
stroke-width='2'
fill='none'
>world</text> -->
</svg>
</body>
</html>
4 线性渐变
id 唯一标识 x1,y1 渐变起始的位置 百分比 或者 0-1 小数 x2,y2 渐变结束的位置 1.创建线性渐变 <defs> <linearGradient id="linear1" x1='0%' y1='0%' x2='100%' y2='100%'> <stop offset="10%" stop-color="red" stop-opacity="0.6" /> 设置颜色 ..... </linearGradient> </defs> 2.使用渐变 <rect x="50" y="50" width="100px" height="100px" style="fill: url(#linear1);"></rect>
代码案例
<!-- <defs> -->
<!-- 1.创建线性渐变 -->
<!-- 角形线性渐变 垂直和水平同canvas-->
<!-- <linearGradient id="linear1" x1='0%' y1='0%' x2='100%' y2='100%'>
<stop offset="10%" stop-color="red" stop-opacity="0.6" />
<stop offset="40%" stop-color="blue" stop-opacity="0.3" />
<stop offset="80%" stop-color="orange" stop-opacity="1" />
<stop offset="100%" stop-color="pink" stop-opacity="0.8" />
</linearGradient> -->
</defs> -->
<!-- 2.使用渐变 -->
<!-- <rect
x='100'
y='100'
width='200'
height='200'
fill='url(#linear1)'
></rect> -->
5放射性渐变
id 唯一标识 cx,cy 外圆圆心位置 r 外圆半径 fx,fy 内圆圆心 1.创建线性渐变 <defs> <radialGradient id='radial' cx="50%" cy="50%" r="50%" fx="50%" fy="50%"> <stop offset="10%" stop-color="red" stop-opacity="0.6" />设置渐变色 ..... </radialGradient> </defs> 2.使用渐变 <circle cx=250 cy=250 r=200 fill='url(#radial)'></circle>
代码案例:
<!-- <defs> --> <!-- 2.创建径向渐变 --> <!-- <radialGradient id='radial' cx="50%" cy="50%" r="50%" fx="50%" fy="50%"> <stop offset="10%" stop-color="red" stop-opacity="0.6" /> <stop offset="40%" stop-color="blue" stop-opacity="0.3" /> <stop offset="80%" stop-color="orange" stop-opacity="1" /> <stop offset="100%" stop-color="pink" stop-opacity="0.8" /> </radialGradient> </defs> --> <!-- 2.使用渐变 --> <!-- <circle cx='250' cy='250' r='200' fill='url(#radial)' ></circle> -->
四、D3.js(了解)
1概念(数据驱动文档)
D3js(Data-Driven Documents),是一个可以基于数据来操作文档的 JavaScript 库。可以帮助你使用 HTML, CSS, SVG 来展示数据。D3 遵循现有的 Web 标准,可以不需要其他任何框架独立运行在现代浏览器中,它结合强大的可视化组件来驱动 DOM 操作。 1.语法层面其借鉴了jquery的链式操作语法 2.D3主要通过svg来绘制图形 3.对开发者要求较高(偏底层),灵活性非常高(功能是一个一个的函数,可以自由组合,没有规则限制) 4.不同版本之间的兼容性比较差(向下兼容) 中文官方网址:https://www.d3js.org.cn/ 原官网(国外网站):https://d3js.org/
2安装引用
一种是可以直接引入:
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
另一种是通过npm安装:
npm i d3@版本号 例如安装3版本:npm i d3@3
3D3基本操作
3.1元素选择
1.选择一个元素
d3.select(class|id|元素名称)
2.给元素赋值文本或者标签元素
d3.select().text()
d3.select().html()
3.选择多个元素
d3.selectAll((class|id|元素名称)
// 1.选择一个元素
// d3.select(class|id|元素名称)
// let div = d3.select('div');
// let div = d3.select('#box');
// let div = d3.select('.box');
// console.log(div);
// 2.给元素赋值文本或者标签元素
// d3.select().text()
// d3.select('div').text('我是div')
// d3.select().html()
// d3.select('div').html('<h1>我是标题</h1>')
// 3.选择多个元素
// d3.selectAll((class|id|元素名称)
// let ps= d3.selectAll('p');
// ps[0].forEach((item,index)=>{
// item.innerHTML = index
// })
3.2添加和删除元素
1.新增元素
d3.select().insert(‘新增元素标签名称’,’参考位置’)
d3.select().append(‘新增元素’)
2.删除元素
d3.select().remove()
// 1.新增元素
// d3.select().insert('新增元素标签名称','参考位置')
// d3.select('div').insert('h1','.p2').text('我是h1')
// d3.select().append('新增元素')
// d3.select('div').append('h2').text('我是h2')
// 2.删除元素
// d3.select().remove()
// d3.select('div').remove();
3.3添加属性
d3.select().attr(‘属性名称’,’属性值’)
// d3.select().attr('属性名称','属性值')
// 在body中创建一个500*500的画布svg
// d3.select('body').append('svg')
// .attr('width',500)
// .attr('height',500)
3.4绑定数据
1.绑定数组到元素上
d3.selectAll().data()
2.绑定字符串到元素上
d3.selectAll().datum()
// 1.绑定数组到元素上
// d3.selectAll().data()
// let score = [90,60,80];
// d3.selectAll('p').data(score)
// .text((d,i)=>{
// console.log(d,i);
// return d
// })
// 2.绑定字符串到元素上
// d3.selectAll().datum()
// d3.selectAll('p').datum('hello')
// .text((d,i)=>{
// console.log(d,i);
// return d
// })
3.5根据绑定数据动态生成或者删除元素
1.动态创建元素
d3.selectAll().data().enter().append()
2.动态删除元素
d3.selectAll().data().exit().remove()
// 1.动态创建元素
// d3.selectAll().data().enter().append()
// 动态创建svg画布
// let svg = d3.select('body').append('svg')
// .attr('width',500)
// .attr('height',500)
// 根据学员的成绩动态绘制柱状图(rect:x y width height)
// let score=[70,90,60,100,50,80];
// svg.selectAll('rect').data(score).enter().append('rect')
// .attr('x',(d,i)=>{return 50*i})
// .attr('y',0)
// .attr('width',30)
// .attr('height',(d,i)=>{return d})
// .attr('fill','steelblue')
// 2.动态删除元素
// d3.selectAll().data().exit().remove()
let score=[90,100];
d3.selectAll('p').data(score).exit().remove();
五、Echarts.js
1Echarts概述
ECharts,一个使用 JavaScript 实现的开源可视化库,由百度商业前端数据可视化团队研发的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。 官方网址:http://echarts.apache.org/zh/index.html echarts社区:https://www.makeapie.com/explore.html
2主要目的
借助图形化的手段,清晰有效地传达与沟通信息,揭示数据中的道理和规律.
3优势
(1)开源软件,提供了非常炫酷的图形界面,尤其是地图,同时还提供了柱状图、折线图、气泡图等。 (2)使用简单,底层用的是javascript封装,可以在html中嵌入图表,直接显示。 (3)兼容性好,基于html5,有着良好的动画渲染效果。
4.Echarts绘制基础柱状图
绘制步骤
1.引入echarts
第一种使用npm安装:
npm install echarts --save
import * as echarts from 'echarts';
Vue.prototype.$echarts = echarts;
第二种使用外链引入: <script src="./echarts.min.js"></script>
下载echarts.js文件以外链方式引入:
官方没有直接下载echarts.js文件这种形式,需要自定义生成echarts.js文件。
地址:https://echarts.apache.org/zh/builder.html
2.创建echarts实例 init()
3.设置绘制图表基本配置 option={图表配置}
4.执行绘图操作 setOption()
5.Echarts基础配置
① title标题组件,包含主标题和副标题
// 配置标题
title:{
link:'http://www.baidu.com',
text:'学生成绩表',
textStyle:{
fontSize:15,
color:'red'
},
subtext:'我是小标题',
subtextStyle:{
color:'steelblue'
},
borderWidth:1,
borderColor:'orange',
borderRadius:15,
left:80,
top:20
},
② xAxis 直角坐标系 grid 中的 x 轴
// 设置x轴
xAxis:{
name:'学员',
type:'category',
data:xData,
axisLine:{show:true},//是否显示坐标轴轴线
axisTick:{show:true},//是否显示坐标上的刻度
},
③ yAxis直角坐标系 grid 中的 y 轴
// 设置y轴
yAxis:{
name:'学科',
type:'value'
}
④ series 系列列表,每个系列通过 type 决定自己的图表类型
series:[
{
type:'bar',
data:yuwenData,
label:{// 配置描述文本
show:true,
rotate:40,
position:'top'
},
barWidth:40,//设置柱的宽度
itemStyle:{
barBorderRadius:[10,10,0,0],//柱状图圆角大小
//渐变颜色 了解
color:new echarts.graphic.LinearGradient(0,0,0,1,[
{
offset:0,
color:'red'
},{
offset:1,
color:'blue'
}
])
},
markPoint:{//设置标记点 max min
data:[
{type:'max',name:'最大值'},
{type:'min',name:'最小值'}
]
},
markLine:{//设置标记线 average
data:[
{type:'average',name:"平均值"}
]
}
}
]
⑤ tooltip提示框组件
// 提示
tooltip:{
show:true,
trigger:'axis',//触发类型
triggerOn:'mousemove',//触发条件
axisPointer:{//指示器
z:0,
type:'line',
lineStyle:{
width:60,
color:'#EEEEEE'
}
}
// formatter:'{a} {b} {c} ',
// formatter:function(param){
// // console.log(param[0])
// },
},
⑥ legend图例组件
//设置图例 配合series 中的name 使用
legend:{
show:true,
// data:['语文','数学'],
data:[
{
name:'语文',
icon:'circle'
},
{
name:'数学',
icon:'rect'
}
]
},
⑦ grid直角坐标系内绘图网格
grid:{
show:true,
left:80,
top:100,
width:'auto',
height:'auto',
containLabel:true//是否包含坐标轴文字描述
},
⑧ 横向柱状图
xAxis和yAxis的type正好相反即可
⑨ color 调色盘
// 调色盘 作用域关系: option.color < series.color < series.itemStyle.color
// 如果没有设置颜色则会依次循环从该列表中取颜色作为系列颜色。
// ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc']
color: ['orange', 'green', 'blue', 'skyblue', 'purple'],
⑩ toolbox工具栏,可以导出图片
// 工具配置
toolbox:{
show:true,
feature:{
saveAsImage:{},//保存图片
dataZoom:{},//视图区域缩放
dataView:{},//数据视图工具
restore:{},//重置刷新
magicType:{//图形切换
type:['bar','line']
}
}
},
⑪ echarts事件
// 1.状图绑定点击事件 全部监听 on
myCharts.on('click', function (arg) {
console.log(arg)
console.log('click...')
}) // 对事件进行监听
// 2.柱状图绑定点击事件 监听系列是语文的柱状图
myCharts.on("click",{seriesName:"语文"},(e)=>{
let { name,value } = e;
console.log(name,value)
})
// 3.click的事件 接触后无法触发以上click事件
// myCharts.off('click')
// 4.窗口的变化动态改变图表大小(以下是简写方式)
window.onresize = myCharts.resize;
//5. myCharts.showLoading(); myCharts.hideLoading();