Echarts图表-学习

Echarts可用来实现多种图表的实现。

注意事项:

一、series

data通常来说,数据用一个二维数组表示。如下,每一列被称为一个『维度』。

series: [{
data: [
// 维度X 维度Y 其他维度 ...
[ 3.4, 4.5, 15, 43],
[ 4.2, 2.3, 20, 91],
[ 10.8, 9.5, 30, 18],
[ 7.2, 8.8, 18, 57]
]
}]
在 直角坐标系 (grid) 中『维度X』和『维度Y』会默认对应于 xAxis 和 yAxis。
在 极坐标系 (polar) 中『维度X』和『维度Y』会默认对应于 radiusAxis 和 angleAxis。
后面的其他维度是可选的,可以在别处被使用,例如:
在 visualMap 中可以将一个或多个维度映射到颜色,大小等多个图形属性上。
在 series.symbolSize 中可以使用回调函数,基于某个维度得到 symbolSize 值。
使用 tooltip.formatter 或 series.label.formatter 可以把其他维度的值展示出来。
特别地,当只有一个轴为类目轴(axis.type 为 'category')的时候,数据可以简化用一个一维数组表示。例如:

xAxis: {
data: ['a', 'b', 'm', 'n']
},
series: [{
// 与 xAxis.data 一一对应。
data: [23, 44, 55, 19]
// 它其实是下面这种形式的简化:
// data: [[0, 23], [1, 44], [2, 55], [3, 19]]
}]

当某维度对应于类目轴(axis.type 为 'category')的时候:

其值须为类目的『序数』(从 0 开始)或者类目的『字符串值』。例如:

xAxis: {
type: 'category',
data: ['星期一', '星期二', '星期三', '星期四']
},
yAxis: {
type: 'category',
data: ['a', 'b', 'm', 'n', 'p', 'q']
},
series: [{
data: [
// xAxis yAxis
[ 0, 0, 2 ], // 意思是此点位于 xAxis: '星期一', yAxis: 'a'。
[ '星期四', 2, 1 ], // 意思是此点位于 xAxis: '星期四', yAxis: 'm'。
[ 2, 'p', 2 ], // 意思是此点位于 xAxis: '星期三', yAxis: 'p'。
[ 3, 3, 5 ]
]
}]

二、time’ 时间轴,

适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。
当某维度对应于时间轴(type 为 'time')的时候,值可以为:

一个时间戳,如 1484141700832,表示 UTC 时间。
或者字符串形式的时间描述:
ISO 8601 的子集,只包含这些形式(这几种格式,除非指明时区,否则均表示本地时间,与 moment 一致):
部分年月日时间: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06'.
使用 'T' 或空格分割: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123'.
时区设定: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00'.
其他的时间字符串,包括(均表示本地时间): '2012', '2012-3-1', '2012/3/1', '2012/03/01', '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'
或者用户自行初始化的 Date 实例:
注意,用户自行初始化 Date 实例的时候,浏览器的行为有差异,不同字符串的表示也不同。
例如:在 chrome 中,new Date('2012-01-01') 表示 UTC 时间的 2012 年 1 月 1 日,而 new Date('2012-1-1') 和 new Date('2012/01/01') 表示本地时间的 2012 年 1 月 1 日。在 safari 中,不支持 new Date('2012-1-1') 这种表示方法。
所以,使用 new Date(dataString) 时,可使用第三方库解析(如 moment),或者使用 echarts.number.parseDate,或者参见 这里。

三、tooltip.formatter

提示框浮层内容格式器,支持字符串模板和回调函数两种形式。

1, 字符串模板

模板变量有 {a}{b}{c}{d}{e},分别表示系列名,数据名,数据值等。 在 trigger 为 'axis' 的时候,会有多个系列的数据,此时可以通过 {a0}{a1}{a2} 这种后面加索引的方式表示系列的索引。 不同图表类型下的 {a}{b}{c}{d} 含义不一样。 其中变量{a}{b}{c}{d}在不同图表类型下代表数据含义为:

  • 折线(区域)图、柱状(条形)图、K线图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无)

  • 散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无)

  • 地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)

  • 饼图、仪表盘、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比)

更多其它图表模板变量的含义可以见相应的图表的 label.formatter 配置项。

示例:

formatter: '{b0}: {c0}<br />{b1}: {c1}'


2, 回调函数

回调函数格式:

(params: Object|Array, ticket: string, callback: (ticket: string, html: string)) => string

第一个参数 params 是 formatter 需要的数据集。格式如下:

{
    componentType: 'series',
    // 系列类型
    seriesType: string,
    // 系列在传入的 option.series 中的 index
    seriesIndex: number,
    // 系列名称
    seriesName: string,
    // 数据名,类目名
    name: string,
    // 数据在传入的 data 数组中的 index
    dataIndex: number,
    // 传入的原始数据项
    data: Object,
    // 传入的数据值
    value: number|Array,
    // 数据图形的颜色
    color: string,

    // 饼图的百分比
    percent: number,

}

在 trigger 为 'axis' 的时候,或者 tooltip 被 axisPointer 触发的时候,params 是多个系列的数据数组。其中每项内容格式同上,并且,

{
    componentType: 'series',
    // 系列类型
    seriesType: string,
    // 系列在传入的 option.series 中的 index
    seriesIndex: number,
    // 系列名称
    seriesName: string,
    // 数据名,类目名
    name: string,
    // 数据在传入的 data 数组中的 index
    dataIndex: number,
    // 传入的原始数据项
    data: Object,
    // 传入的数据值
    value: number|Array,
    // 数据图形的颜色
    color: string,

}

四、每秒变动的x轴

示例代码:

点击出现的弹框部分:

<div class="hov-wrap disnone" onclick="initChart(' +data[i].devid+ ')" ><span class="mt-mid">查看统计</span></div>

核心部分:

//实时监控图表
var actual_chart = echarts.init(document.getElementById('actual_line'));

// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function (fmt) { // author: meizz
var o = {
"M+": this.getMonth() + 1, // 月份
"d+": this.getDate(), // 日
"h+": this.getHours(), // 小时
"m+": this.getMinutes(), // 分
"s+": this.getSeconds(), // 秒
"q+": Math.floor((this.getMonth() + 3) / 3), // 季度
"S": this.getMilliseconds() // 毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};

sysTim = getTimeArr(); //x轴的动态系统时间,按每秒显示,共显示12条

function getTimeArr() {
var now = new Date();
var begin = new Date(now.getTime() - 12 * 1000);
var arr = [];

for (var i = 12; i > 0; i--) {
arr.push(new Date(now.getTime() - i * 1000).Format("hh:mm:ss"));
}

return arr;
}

//暂时用计时器来模拟每秒的操作
actual_chart_timer = null;

//y轴数据
function getEmptyArray() {
return [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
}
function randomData() {
value = value + Math.random() * 21 - 10;
return {
value:
Math.round(value)
}
}
fvalArr01 = getEmptyArray();
var value = Math.random() * 1000;
for (var i = 0; i < 1000; i++) {
fvalArr01.push(randomData());
}


/实时监控线
drawSmoothCurve(fvalArr01,unitName,devname);

function drawSmoothCurve(fvalArr01,unitName,devname) {
var chart_data = fvalArr01;
//画图
//2019.3.19 实时监控-采用每秒钟展示数据
var option = {
xAxis: {
boundaryGap: false,
type: 'category',
data: sysTim,
axisLabel : {
color : '#3B53A2',
fontSize : '11',
interval : 0,
textAlign: "left"
},
axisLine : {
lineStyle : {
color : '#3B53A2'
}
},
splitLine : {
show : false,
lineStyle : {
color : '#3B53A2'
}
}
},
yAxis: {
type: 'value',
axisLabel : {
color : '#3B53A2',
fontSize : '11',
interval : 0,
formatter : '{value}' + unitName
},
axisLine : {
lineStyle : {
color : '#3B53A2'
}
},
splitLine : {
show : true,
lineStyle : {
color : '#CDD9F0'
}
}
//axisLabel:{formatter:'{value}' + unit}
},
legend : {
data : devname,
textStyle : {
color : '#3B53A2'
},
inactiveColor : '#CDD9F0',
top : 2
},
grid: {
top:'10%',
left : '2%',
right : '3%',
bottom : '3%',
containLabel: true
},
tooltip: {
trigger: 'axis',
backgroundColor: '#0D1B42', //鼠标移动到图上面时,显示的背景颜色
padding:15, //定义内边距
formatter: function(params) { //自定义函数修改折线图给数据加单位
// console.log(params);
var str = '';//声明一个变量用来存储数据
str += '<div style=" 12px;height: 12px;border-radius: 50%;float: left;margin-top: 5px;"></div>';
for(var i=0; i<params.length; i++) { //图显示的数据较多时需要循环数据,这样才可以成功的给多条数据添加单位
str += '<div style="color:#ffffff;"><span style="margin-left: 10px;">'+ (params[i].data.value ? params[i].data.value + unitName : '暂无') +'&nbsp;&nbsp;&nbsp;</span></div>';
}
return str;
}
},
series: [{
name: devname,
type: 'line',
label:{
/* show:true*/
},
smooth: true,
data: chart_data
}]
};



actual_chart_timer = setInterval(function () {
actual_chart.setOption(option);
var now = new Date(); console.log(now);

sysTim.shift();
sysTim.push(now.Format("hh:mm:ss"));

chart_data.shift();
chart_data.push(randomData());


actual_chart.setOption({
series: [{
data: chart_data
}]
});
}, 1000);


}


$(window).resize(function() {
actual_chart.resize();
});


//弹框关闭操作
function closeChartModal(that) {
$("#detail_modal").modal("hide");
window.clearInterval(actual_chart_timer);
}



未完待续...

原文地址:https://www.cnblogs.com/sylvia-Camellia/p/10579893.html