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="width: 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 : '暂无') +' </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);
}
未完待续...