前言
在当今大数据时代,实时数据监控已经成为众多业务场景的核心需求,无论是工业生产过程监控、服务器性能指标追踪,还是金融交易系统的实时行情分析,都离不开高效且直观的数据可视化工具。ECharts作为一款强大的开源JavaScript图表库,以其丰富的图表类型和高度自定义能力深受开发者喜爱。本文将重点介绍如何运用ECharts中的折线图(Line Chart)结合MarkArea组件,实现实时数据监控中的动态报警区间可视化。
一、什么是 markArea
markArea 是 echarts 中的一个功能,可以用来绘制区域标记。通过 markArea,我们可以在图表中标记出某个区域,从而更加直观地展示数据。
二、如何使用 markArea 监测设备异常报警
1. 准备数据
在使用 markArea 功能之前,我们需要准备好数据。在本文中,我们将以一个监测设备的数据为例。设备每隔一段时间会发送一次数据,如果数据正常,那么不做任何处理;如果数据异常,我们需要把这个时间段标记出来,以便后续处理。
首先,我需要准备一个数组 xAxisData,用来存储设备发送数据的时间点。例如:
代码语言:js复制var xAxisData = ['00:00', '01:15', '02:30', '03:45', '05:00', '06:15', '07:30', '08:45', '10:00', '11:15', '12:30', '13:45', '15:00', '16:15', '17:30', '18:45', '20:00', '21:15', '22:30', '23:45'];
接下来,我们需要准备一个储存报警信息的数组 alarm,用来存储设备在对应时间点是否发送异常数据的信息。例如:
代码语言:js复制var alarm = [true, false, true, ...];
在这个例子中,如果 alarmi 的值为 true,表示设备在 xAxisDatai 这个时间点发送了异常数据;如果 alarmi 的值为 false,表示设备在 xAxisDatai 这个时间点发送了正常数据。
2. 编写功能函数
接下来,我们需要编写一个函数 alarmToMarkData,用来将 alarm 数组转换成 markArea 的数据格式。函数代码如下:
代码语言:js复制function alarmToMarkData(alarm, value) {
let start = -1;
const markAreaData = [];
for (let i = 0; i < alarm.length; i ) {
if (alarm[i] === true && start === -1) {
start = i;
} else if (alarm[i] === false && start !== -1) {
markAreaData.push([{ xAxis: value[start] }, { xAxis: value[i - 1] }]);
start = -1;
}
}
// 处理最后一个时间点报警的情况
if (start !== -1 && alarm[alarm.length - 1]) {
markAreaData.push([{ xAxis: value[start] }, { xAxis: value[alarm.length - 1] }]);
}
return markAreaData;
}
该函数接受两个参数:alarm 和 value。其中,alarm 是一个布尔型数组,用来存储设备在对应时间点是否发送异常数据的信息;value 是一个字符串型数组,用来存储设备发送数据的时间点。
3. 函数的实现思路
- 遍历 alarm 数组,如果当前元素为 true,且 start 值为 -1,则说明当前是一个异常报警的起始时间点,将 start 赋值为当前下标。
- 如果当前元素为 false,且 start 值不为 -1,则说明当前是一个异常报警的结束时间点,将这个时间段的起始时间点和结束时间点存入 markAreaData 数组中,并将 start 值重置为 -1。
- 最新一条数据处理,如果 start 值不为 -1,且最后一个元素为 true,说明最后一个时间点也是一个异常报警的结束时间点,将这个时间段的起始时间点和结束时间点存入 markAreaData 数组中。
三、 配置 markArea
我们需要将 markArea 添加到 echarts 的 series 中。具体代码如下:
代码语言:js复制var series = {
name: '异常报警',
type: 'line',
smooth: true,
markArea: {
itemStyle: {
color: 'rgba(255, 0, 0, 0.6)'
},
data: alarmToMarkData(alarm, xAxisData)
}
};
在这个例子中,我们将 markArea 添加到了一个 type 为 line 的 series 中。我们还可以根据实际需求,将 markArea 添加到其他类型的 series 中,例如 bar、scatter 等等。
在 markArea 中,我们设置了 itemStyle 的颜色为红色,并将 data 设置为 alarmToMarkData(alarm, xAxisData)。这样,我们就完成了 markArea 的配置。
四、完整代码
代码语言:js复制<template>
<div id="main"></div>
</template>
<script>
export default {
data() {
return {
data: ['00:00', '01:15', '02:30', '03:45', '05:00', '06:15', '07:30', '08:45', '10:00', '11:15', '12:30', '13:45', '15:00', '16:15', '17:30', '18:45', '20:00', '21:15', '22:30', '23:45'],
alarm :[true, false, false, true, false, true, true, true, false, false, true, true, true, true, false, false, true, false, false, false]
}
},
mounted () {
this.init();
},
methods: {
init() {
import * as echarts from "echarts";
var chartDom = document.getElementById("main");
var myChart = echarts.init(chartDom);
var option = {
tooltip: {
trigger: "axis",
},
toolbox: {
show: true,
feature: {
saveAsImage: {},
},
},
xAxis: {
type: "category",
boundaryGap: false,
data: this.data
},
yAxis: {
type: "value",
},
series: [
{
name: "异常报警",
type: "line",
smooth: true,
markArea: {
itemStyle: {
color: "rgba(255, 0,0, 0.6)",
},
data: this.alarmToMarkData(this.alarm, this.data),
},
},
],
};
option && myChart.setOption(option);
},
alarmToMarkData(alarm, value) {
let start = -1;
const markAreaData = [];
for (let i = 0; i < alarm.length; i ) {
if (alarm[i] === true && start === -1) {
start = i;
} else if (alarm[i] === false && start !== -1) {
markAreaData.push([{ xAxis: value[start] }, { xAxis: value[i - 1] }]);
start = -1;
}
}
// 处理最后一个时间点报警的情况
if (start !== -1 && alarm[alarm.length - 1]) {
markAreaData.push([
{ xAxis: value[start] },
{ xAxis: value[alarm.length - 1] },
]);
}
console.log(markAreaData);
return markAreaData;
},
},
};
</script>
五、报警区域效果
总结
本文介绍了如何利用 markArea 功能来监测设备异常报警。通过准备好数据、编写函数和配置 markArea,我们可以在 echarts 中标记出设备异常报警的时间段,从而更加直观地展示数据。在实际应用中,我们可以根据实际需求,对 markArea 进行更加灵活的配置,以满足不同的监测需求。