数据可视化概念:
把数据以图表的方式体现,更加直观可见,如下文字和图表对比: 数据可视化实现的方式:
报表类:Excel 、水晶报表等,面向非技术人员,点击图标即可生成图表,非常不灵活。
商业智能BI:Microsoft BI 、Power-BI等,也可以展示图表信息,并且可以自己做出决策,
编码类:Echarts.js、D3.js、Chart.js等,灵活性高,可视化度高,需要有编码经验的工程师才能开发。
echarts简介:
ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,兼容性极好,支持pc和移动等多端,开源免费,社区活跃,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目;JavaScript数据可视化库有很多种,常用的如:D3.js、Recharts、Chart.js等,ECharts 其官网:https://echarts.apache.org/zh/index.html
多种数据格式支持:
key-value、二维表、typedarray格式
流数据的支持:支持加载多少数据,渲染多少数据。
增量渲染技术:变化的渲染数据,可以提高性能。
Echarts基本使用:
1.引入echarts.js文件:框架开发中支持模块化导入
2.准备一个呈现图表的容器(div):给上尺寸
3.初始化echarts实例对象:
4.准备配置项:
5.将配置项设置给echarts实例对象
原生js中使用:
<body>
<!-- 1.引入echarts.js文件:,如果是在vue等框架的支持下,可以使用模块化引入 -->
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
<!-- 2.准备一个呈现图表的容器(div): -->
<div style="width: 600px;height:500px"></div>
<script>
const myChart = echarts.init(document.querySelector('div'),'dark')
const options = {
xAxis: {
type: 'category',
data: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
},
yAxis: {
type: 'value'
},
series: [
{
name: '服装销量',
type: 'bar',
data: [5, 7, 8, 20, 2, 7, 8, 15, 5, 12, 15, 18, 12],
color: ['skyblue','#000000'],
colorBy: 'data',
itemStyle: {
color: {
type: 'linear',
x:0,
y:0,
x2:1,
y2:1,
colorStops: [
{
offset:0,
color:'skyblue'
},
{
offset:1,
color:'yellow'
}
]
}
}
},
{
name: '服装销量',
type: 'line',
data: [5, 7, 8, 20, 2, 7, 8, 15, 5, 12, 15, 18, 12]
}
]
}
myChart.setOption(options)
</script>
</body>
vue中使用:
<template>
<!-- 主要盒子 -->
<div style="width: 100%;height:100%">
<!-- 2.准备一个呈现图表的容器(div) -->
<div ref="alarm" style="width: 600px;height:500px"></div>
</div>
</template>
<script>
import * as echarts from 'echarts'
export default {
mounted () {
this.barEchartsHandle()
},
methods: {
barEchartsHandle () {
const myChart = echarts.init(this.$refs.alarm)
const options = {
xAxis: {
type: 'category',
data: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
},
yAxis: {
type: 'value'
},
series: [
{
name: '服装销量',
type: 'bar',
data: [5, 7, 8, 20, 2, 7, 8, 15, 5, 12, 15, 18, 12]
},
{
name: '服装销量',
type: 'line',
data: [5, 7, 8, 20, 2, 7, 8, 15, 5, 12, 15, 18, 12]
}
]
}
myChart.setOption(options)
}
}
}
</script>
<style lang="less" scoped></style>
效果图: echarts中配置项options
echarts中配置项options配置非常多,下面简单介绍常用配置项:
通用配置:这些通用配置会在下面Echarts中常用7大类图表中体现出,稍微注意就可以。
标题title(标题样式textStyle、标题宽度borderWidth、标题颜色borderColor、标题圆角borderRadius)
提示框tooltip,鼠标滑过会出现提示框,触发类型trigger(item/axis)、触发时机triggerOn(mousemove/click)、格式化formatter(可以接收字符串、模板字符串、有返回值的回调函数,模板变量时有特殊含义变量:系列名{a}、数据名{b}、数据值{c}、{d}、{e}、),属性较多,粘上官方文档:https://echarts.apache.org/zh/option.html#%2Fsearch%2Fformatter
工具按钮toolbox提供导出图片、重置试图、动态类型切换、数据区域缩放、数据试图五个工具
图例legend
样式:可以给某个item设置不同的样式,可分为:直接样式(itemStyle/textStyle/lineStyle/areaStyle/label)和高亮样式(在emphasis中包裹itemStyle/textStyle/lineStyle/areaStyle/label)
**重新熏染图表:**根据浏览器大小重新渲染图表大小,init的实例下有方法:resize()
加载动画:init的实例下有方法:showLoading()/hideLoading()
**私有配置:**不同的类型表有自己私有的配置属性,下面会有案例说明。
增量动画:如果要改变图表中的某些数据,还想要动画的方式体现,此时可以直接创建一个新的数据options配置对象,之后设置给原来的实例(setOption()),这里不会完全覆盖,它只会将不同的数据进行整合
Echarts中常用7大类图表:
1.柱状图:
const options = {
title: {
text: '服装每月销售量',
link: 'http:www.baidu.com',
textStyle: {
color: 'skyBlue'
},
borderWidth: 2,
borderColor: 'yellow',
borderRadius: 5,
left: 30,
top: 10
},
tooltip: {
trigger: 'axis',
triggerOn: 'mousemove',
formatter: (e) => {
return `<div style='background:skyblue;color:#fff;'>${e[0].name}的销量为:${e[0].data}</div>`
}
},
toolbox: {
feature: {
saveAsImage: {},
dataView: {},
restore: {},
dataZoom: {
yAxisIndex: 'none'
},
magicType: { type: ['line', 'bar','stack'] },
}
},
xAxis: {
type: 'category',
data: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
},
yAxis: {
type: 'value'
},
legend: {
data: ['服装销量','餐饮销量']
},
series: [
{
name: '服装销量',
type: 'bar',
data: [5, 7, 8, 20, 2, 7, 8, 15, 5, 12, 15, 18, 12],
markPoint: {
data: [
{
type: 'max',
name: '最大值'
},
{
type: 'min',
name: '最小值'
}
]
},
markLine: {
data: [
{
type: 'average',
name: '平均值'
}
]
},
label: {
show: true,
rotate: 60,
position: 'top'
},
barWidth: '20%'
},
{
name: '餐饮销量',
type: 'line',
data: [15, 17, 18, 30, 12, 17, 18, 25, 15, 22, 15, 28, 22],
markPoint: {
data: [
{
type: 'max',
name: '最大值'
},
{
type: 'min',
name: '最小值'
}
]
},
markLine: {
data: [
{
type: 'average',
name: '平均值'
}
]
},
label: {
show: true,
rotate: 0,
position: 'top'
}
}
]
}
2.折线图:
const options = {
title: {
text: '服装每月销售量',
link: 'http:www.baidu.com',
textStyle: {
color: 'skyBlue'
},
borderWidth: 2,
borderColor: 'yellow',
borderRadius: 5,
left: 30,
top: 10
},
tooltip: {
trigger: 'axis',
triggerOn: 'mousemove',
formatter: (e) => {
return `<div style='background:skyblue;color:#fff;'>${e[0].name}的销量为:${e[0].data}</div>`
}
},
toolbox: {
feature: {
saveAsImage: {},
dataView: {},
restore: {},
dataZoom: {
yAxisIndex: 'none'
},
magicType: { type: ['line', 'bar','stack'] },
}
},
xAxis: {
type: 'category',
data: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
boundaryGap: false
},
yAxis: {
type: 'value',
scale: true
},
series: [
{
name: '服装销量',
type: 'line',
data: [5, 6, 6, 5, 5, 6, 5, 5, 6, 5, 6, 5, 5],
markPoint: {
data: [
{
type: 'max',
name: '最大值'
},
{
type: 'min',
name: '最小值'
}
]
},
markLine: {
data: [
{
type: 'average',
name: '平均值'
}
]
},
markArea: {
data: [
[
{xAxis: '1月'},
{xAxis: '2月'}
],
[
{xAxis: '7月'},
{xAxis: '9月'}
]
],
},
label: {
show: true,
rotate: 60,
position: 'top'
},
smooth: true,
lineStyle: {
color: 'yellow',
type: 'dotted'
},
areaStyle: {
color: 'pink'
}
}
]
}
3.散点图:折线图,柱状图散点图都在直角坐标系中,可以对直角坐标系进行配置(grid网格,axis坐标轴,dataZoom区域缩放),下面散点图中有关于直角坐标系配置说明:
const options = {
dataZoom: [
{
type: 'slider',
xAxisIndex: 0,
start: 20,
end: 80
}
],
grid: {
show: true,
borderWidth: 5,
borderColor: 'skyblue',
top: 100,
width: 400,
height: 300
},
xAxis: {
type: 'value',
scale: true,
position: 'top'
},
yAxis: {
type: 'value',
scale: true
},
series: [
{
type: 'effectScatter',
rippleEffect: {
scale: 10
},
showEffectOn: 'render',
data: [[1, 2], [2, 4], [3, 6], [4, 8],[7, 2], [7, 4], [8, 6], [1, 8]],
symbolSize: (e) => {
let a = e[0]
let b = e[1]
if (a * b > 30) {
return 20
}
return b * a
},
itemStyle: {
color: (e) => {
let a = e.data[0]
let b = e.data[1]
if (a * b > 20) {
return 'yellow'
}
return 'blue'
}
}
}
]
}
4.饼图:
const options = {
series: [
{
type: 'pie',
label: {
show: true,
formatter: (e) => {
return `在${e.name}消费${e.value}元,占比${e.percent}%`
}
},
radius: ['50%', '80%'],
roseType: 'radius',
itemStyle: {
borderRadius: 5
},
selectedMode: 'single',
selectedOffset: 30,
data: [
{
name: '京东',
value: '5312'
},
{
name: '淘宝',
value: '2312'
},
{
name: '唯品会',
value: '1312'
}
]
}
]
}
5.地图:
地图的使用方式有两种:第三方地图api如百度地图api、矢量地图
矢量图地图:
<!-- 需要引入china.js文件,chian.js文件需要自己在网上找 -->
<script src="./china.js"></script>
const options = {
geo: {
type: "map",
map: "china",
roam: true,
label: {
show: true
},
itemStyle: {
areaColor: 'green',
borderColor: '#fff'
},
emphasis: {
itemStyle: {
areaColor: "#31C6BC"
}
}
},
backgroundColor: "#071510",
series: [
{
type: "lines",
coordinateSystem: "geo",
zlevel: 5,
effect: {
show: true,
period: 5,
trailLength: 0.7,
symbol: "triangle",
symbolSize: 8,
color: "red",
},
lineStyle: {
normal: {
show: true,
width: 0.5,
opacity: 1,
curveness: 0.3,
color: "#37F6E0",
},
color: "#37F6E0",
},
data: [
{
coords: [
[103.823557, 36.058039],
[113.280637,23.125178]
]
},
{
coords: [
[113.280637,23.125178],
[120.153576,30.287459]
]
},
{
coords: [
[120.153576,30.287459],
[117.000923,36.675807],
]
},
{
coords: [
[117.000923,36.675807],
[103.823557, 36.058039],
]
},
{
coords: [
[103.823557, 36.058039],
[120.153576,30.287459],
]
}
]
},
{
type: "effectScatter",
coordinateSystem: "geo",
effectType: "ripple",
showEffectOn: "render",
rippleEffect: {
color: "#37F6E0",
period: 2,
scale: 15,
brushType: "fill",
},
symbolSize: 2,
hoverAnimation: true,
itemStyle: {
color: 'rgba(255,255,255,.1)',
},
zlevel: 3,
data: [
{ name: "甘肃", value: [103.823557, 36.058039] },
{name: '广东',value: [113.280637,23.125178]},
{name: '山东',value: [117.000923,36.675807]},
{name: '浙江',value: [120.153576,30.287459]}
]
}
]
}
百度api地图实现:详细可参考开发文档:https://lbsyun.baidu.com/index.php?title=jspopular
<!DOCTYPE html>
<html>
<head>
<title>设置地图3D视角</title>
</head>
<body>
<script src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=pgDPmxNXENGjQG9fv5S2DnTu3QpOTXOw"></script>
<div id="allmap" style="height:800px;width:1000px;"></div>
<script>
var map = new BMapGL.Map("allmap")
map.centerAndZoom(new BMapGL.Point(116.280190, 40.049191), 19)
map.enableScrollWheelZoom(true)
map.setHeading(64.5)
map.setTilt(73)
</script>
</body>
</html>
6.雷达图:
const options = {
radar: {
indicator: [
{
name: '收入',
max: 100
},
{
name: '支出',
max: 100
},
{
name: '负债',
max: 100
},
{
name: '经验',
max: 100
},
{
name: '存款',
max: 100
}
],
shape: 'circle'
},
series: [
{
type: 'radar',
label: {
show: true
},
areaStyle: {},
data: [
{
name: '小明',
value: [20, 50, 100, 20, 30]
},
{
name: '小红',
value: [60, 20, 10, 100, 20]
}
]
}
]
}
7.仪表盘图:
const options = {
series: [
{
type: 'gauge',
data: [
{
value: 220,
itemStyle: {
color: 'red'
}
},
{value: 98}
],
max: 240,
min: 0
}
]
}
提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者 删除。 笔者:苦海
|