深入探究ECharts在实时数据监控中的动态报警区间可视化

2024-01-09 23:15:11 浏览数 (2)

前言

在当今大数据时代,实时数据监控已经成为众多业务场景的核心需求,无论是工业生产过程监控、服务器性能指标追踪,还是金融交易系统的实时行情分析,都离不开高效且直观的数据可视化工具。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 进行更加灵活的配置,以满足不同的监测需求。

0 人点赞