echarts绘制出你心目中的图表
写在前面
在大三下学期软件项目的实际开发中,往往涉及到系统的审计模块。我们选用echarts作为各类图表的绘制,首先上图(忽略中间的百度地图api):
ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。这是项目中管理员部分的首页审计界面。下面将进行详细介绍。
echarts基本结构
引入echarts
在web前端通常使用标签的方式引入echarts。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- 引入 ECharts 文件 -->
<script src="https://cdn.bootcss.com/echarts/4.6.0/echarts.min.js"></script>
</head>
</html>
初始化echarts
在绘图前我们需要为 ECharts 准备一个具备高宽的 DOM 容器。
<body>
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="main" style="width: 600px;height:400px;"></div>
</body>
然后就可以通过 echarts.init 方法初始化一个 echarts 实例
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
<script>
用 option 描述图表
使用 option 来描述其对图表的各种需求,包括:有什么数据、要画什么图表、图表长什么样子、含有什么组件、组件能操作什么事情等等。
option中的元素之一:组件(component).如xAxis(直角坐标系 X 轴)、yAxis(直角坐标系 Y 轴)、grid(直角坐标系底板)、dataZoom(数据区缩放组件)、visualMap(视觉映射组件)、tooltip(提示框组件)、toolbox(工具栏组件)等。
系列(series):一组数值以及他们映射成的图,系列也可以称为组件。
option编写示例如下:
var option={
//图表的标题组件
title:{
text:'系统上传视频转码状态'
},
//图表的工具栏组件
toolbox: {
show : true,//工具栏可显示
feature : {
mark : {show: true},
dataView : {show: true, readOnly: false},//可点击查看具体数据
restore : {show: true},//图表可以刷新
saveAsImage : {show: true}//图表可以以图片的形式保存
}
},
//图表的y坐标轴
yAxis:{
type: 'value',//定义数据类型
data:[1,2,3,4]//数据
},
//图表的x坐标轴
yAxis:{
type: 'value',//定义数据类型
data:[1,2,3,4]//数据
},
//series中定义图表的类型,bar说明这是一个柱状图
series:[{
name:'视频数量',
type:'bar',
data:values //values为需显示的数据列表
}]
显示图表
编写完option后,显示图表:
option && myChart.setOption(option);
echarts图表自适应
用window.onresize = myChart.resize; 可以完成自适应,就是把window的onresize事件赋值为echart的resize事件。当然这是单个图表的情况,要是多个图表,发现会不起作用。多个图表可以使用addEventListener,即
window.addEventListener("resize", () => {
this.myChart.resize();
this.myChart2.resize();
this.myChart3.resize();
});
echarts绘制图表的基本流程
- 引入echarts.min.js(推荐使用echarts5)
- 初始化echarts:var myChart = echarts.init(document.getElementById(‘xxx’));
- 编写option指定显示选项及数据
- 显示图表:option&&myChart.setOption(option);
饼状图(系统上传视频转码状态)
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main1'),'dark');
//从html标签中获取数据
var initNum=$("#initNum").val();
var progressNum=$("#progressNum").val();
var finishNum=$("#finishNum").val();
var errorNum=$("#errorNum").val();
var option={
//图表标题
title:{
text:'系统上传视频转码状态'
},
//工具选项
toolbox: {
show : true,
feature : {
mark : {show: true},
dataView : {show: true, readOnly: false},
restore : {show: true},
saveAsImage : {show: true}
}
},
//视觉组件,用于颜色的映射
visualMap: {
show: false,
//显示的数值大小在0-100之内
min: 0,
max: 100,
inRange: {
colorLightness: [0, 1]
}
},
//定义饼状图
series : [
{
name: '转码状态',
type: 'pie',
radius: '55%',
data:[
{value:initNum, name:'待转码'},
{value:progressNum, name:'转码中'},
{value:finishNum, name:'转码成功'},
{value:errorNum, name:'转码失败'},
],
roseType: 'angle',//设置成南丁格尔图
//该系列的文本设置
label: {
normal: {
textStyle: {
color: 'rgba(255,255,255,0.3)'
}
}
},
//饼图的话还要将标签的视觉引导线的颜色设为浅色。
labelLine: {
normal: {
lineStyle: {
color: 'rgba(255, 255, 255, 0.3)'
}
}
},
//itemStyle的emphasis是鼠标 hover 时候的高亮样式。这个示例里是正常的样式下加阴影
itemStyle: {
normal: {
color: '#c23531',
shadowBlur: 200,
shadowColor: 'rgb(11,11,11)'
}
}
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
显示效果:
数据异步加载的柱状图
var myChart1 = echarts.init(document.getElementById('main2'),'dark');
//myChart.showLoading();
var time=[];
var values=[];
//通过ajax异步获取数据
function fetchData(cb){
$.ajax({
type:"post",
async:false,
url:"/getNumByDatem",
data:{},
dataType:"json",
success:function(result){
if(result){
for(var i=0;i<result.length;i++)
{
//将数据写入列表中
time.push(result[i].date);
values.push(result[i].num);
}
}
},
error:function(errorMsg){
alert("失败!");
myChart1.hideLoading();
}
});
//定义异步加载时间
setTimeout(function(){
cb({
time:time,
values:values
});
},1000);
}
//先初步定义一个option,其中数据为空
var option={
title:{
text:'系统近7天上传视频数量'
},
tooltip:{},
toolbox: {
show : true,
feature : {
mark : {show: true},
dataView : {show: true, readOnly: false},
magicType : {show: true, type: ['line', 'bar']},
restore : {show: true},
saveAsImage : {show: true}
}
},
legend:{
data:['视频数量']
},
xAxis:{
data:[]
},
yAxis:{},
//series定义图表为柱状图
series:[{
name:'视频数量',
type:'bar',
data:values
}]
};
//显示加载动画
myChart1.showLoading();
//通过fetchData获取从后端传来的数据并重新设置option,写入数据
fetchData(function(data){
myChart1.hideLoading();
myChart1.setOption({
xAxis:{
data:data.time
},
series:[{
name:'视频数量',
data:data.values
}]
});
});
option&&myChart1.setOption(option);
显示效果:
堆叠条形图
<script type="text/javascript">
var myChart4 = echarts.init(document.getElementById('main5'),'dark');
var time2=[];
var pre=[];
var sub=[];
var post=[];
$.ajax({
type:"post",
async:false,
url:"/getNumBytype",
data:{"type":"preProcess"},
dataType:"json",
success:function(result){
if(result){
for(var i=0;i<result.length;i++)
{
time2.push(result[i].date);
pre.push(result[i].num);
}
}
},
error:function(errorMsg){
}
});
//...同样以ajax的方式获取合成处理postProcess、字幕处理subProcess的数据,在此省略
var option={
//提示框组件
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
legend: {
data: ['预处理', '合成处理', '字幕处理']
},
toolbox: {
show : true,
feature : {
mark : {show: true},
dataView : {show: true, readOnly: false},
restore : {show: true},
saveAsImage : {show: true}
}
},
//图表定位
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value'
},
yAxis: {
type: 'category',
data: time
},
series: [
{
name: '预处理',
type: 'bar',
stack: '总量',
label: {
show: true,
position: 'insideRight'
},
data: pre
},
{
name: '合成处理',
type: 'bar',
stack: '总量',
label: {
show: true,
position: 'insideRight'
},
data: post
},
{
name: '字幕处理',
type: 'bar',
stack: '总量',
label: {
show: true,
position: 'insideRight'
},
data: sub
}
]
};
option && myChart4.setOption(option);
</script>
显示效果:
总结
echarts更多特性可参考官方文档:https://echarts.apache.org/zh/index.html