【ECharts】使用 ECharts 处理不同时间节点的数据系列展示
创始人
2025-01-07 08:34:12
0次

使用 ECharts 处理不同时间节点的数据系列展示

在数据可视化中,我们经常遇到这样的问题:不同数据系列的数据点在时间轴上并不对齐。这种情况下,如果直接在 ECharts 中展示,图表可能会出现混乱或不准确。本文将通过一个示例代码,演示如何解决这一问题,使得多个数据系列在同一个图表中能够准确展示。
在这里插入图片描述

问题描述

假设我们有多个测站(stations),每个测站有多个目标(targets),每个目标在不同的时间点采集数据。为了将这些数据在同一个图表中展示,我们需要对时间点进行统一处理,使得每个时间点都有相应的数据值。具体来说,我们需要将数据重新采样到一个统一的时间轴上。

示例代码

以下代码演示了如何将不同时间节点的数据系列重新采样到统一的时间轴上,并生成新的数据结构,以便在 ECharts 中展示。

function aggregateData(stations) {     // 生成新的时间点,五分钟一个间隔     function generateTimePoints(startTime, endTime) {         let times = [];         let current = new Date(startTime);         while (current <= endTime) {             times.push(current.toTimeString().substring(0, 5));             current.setMinutes(current.getMinutes() + 5);         }         return times;     }      // 解析时间字符串为Date对象     function parseTime(timeStr) {         let parts = timeStr.split(":");         let date = new Date();         date.setHours(parseInt(parts[0]), parseInt(parts[1]), 0, 0);         return date;     }      // 初始化新的时间点     let allProduceTimes = [];     stations.forEach(station => {         station.targets.forEach(target => {             target.produceTime.forEach(time => {                 allProduceTimes.push(parseTime(time));             });         });     });      let minTime = new Date(Math.min.apply(null, allProduceTimes));     let maxTime = new Date(Math.max.apply(null, allProduceTimes));     let newProduceTimes = generateTimePoints(minTime, maxTime);      // 重新填充数据     stations.forEach(station => {         station.targets.forEach(target => {             let newData = new Array(newProduceTimes.length).fill(0);             let index = 0;              target.produceTime.forEach((time, i) => {                 let parsedTime = parseTime(time);                  while (index < newProduceTimes.length && parsedTime >= parseTime(newProduceTimes[index])) {                     index++;                 }                  if (index > 0) {                     newData[index - 1] = parseFloat(target.data[i]);                 }             });              target.produceTime = newProduceTimes;             target.data = newData.map(value => value.toFixed(1)); // 保留一位小数         });     });      return stations; }  // 示例输入 let stations = [     {         "inverterno": "2005435242250085",         "targets": [             {                 "value": "todayEnergy",                 "unit": 4,                 "data": [                     "22.3", "23.3", "24.2", "25.2", "26.1", "26.9", "27.8", "28.6", "29.3", "30.0", "30.7", "31.4", "32.0", "32.5", "33.2", "33.8", "34.4", "35.0", "35.6", "36.2"                 ],                 "produceTime": [                     "05:39", "05:44", "05:49", "05:54", "05:59", "06:04", "06:09", "06:14", "06:19", "06:24", "06:29", "06:34"                 ]             },             {                 "value": "totalEnergy",                 "unit": 4,                 "data": [                     "1797.0", "1797.0", "1798.0", "1799.0", "1799.0", "1800.0", "1801.0", "1801.0", "1802.0", "1802.0", "1803.0", "1804.0"                 ],                 "produceTime": [                     "05:39", "05:44", "05:49", "05:54", "05:59", "06:04", "06:09", "06:14", "06:19", "06:24", "06:29", "06:34"                 ]             }         ]     },     {         "inverterno": "2005435242250086",         "targets": [             {                 "value": "todayEnergy",                 "unit": 4,                 "data": [                     "0.0", "0.0", "0.0", "0.1", "0.1", "0.1", "0.1", "0.1", "0.1", "0.1", "0.2", "0.2", "0.2", "0.3", "0.4", "0.4", "0.5", "0.6", "0.7"                 ],                 "produceTime": [                     "05:27", "05:32", "05:37", "05:42", "05:47", "05:52", "05:57", "06:02", "06:07", "06:12", "06:17", "06:22"                 ]             },             {                 "value": "totalEnergy",                 "unit": 4,                 "data": [                     "1106.0", "1106.0", "1106.0", "1106.0", "1106.0", "1106.0", "1106.0", "1106.0", "1106.0", "1106.0", "1106.0", "1106.0"                 ],                 "produceTime": [                     "05:27", "05:32", "05:37", "05:42", "05:47", "05:52", "05:57", "06:02", "06:07", "06:12", "06:17", "06:22"                 ]             }         ]     } ];  let aggregatedStations = aggregateData(stations); console.log(JSON.stringify(aggregatedStations, null, 2)); 

代码详解

  1. 生成新的时间点:
    generateTimePoints函数生成一个从startTime到endTime的时间点数组,时间间隔为5分钟。这样我们可以确保所有数据系列的时间点都是对齐的。

  2. 解析时间字符串为Date对象:
    parseTime函数将时间字符串(例如"05:39")解析成Date对象,以便进行时间计算。

  3. 初始化新的时间点:
    遍历所有的测站和目标,收集所有的生产时间点,找到最小时间点和最大时间点,并生成包含所有时间点的数组newProduceTimes。

  4. 重新填充数据:
    遍历每个测站和目标,将旧时间点和数据映射到新的时间点数组上。新的数据newData初始化为0数组,然后根据旧时间点填充相应的数值。

在 ECharts 中展示

现在,我们已经将数据重新采样到统一的时间轴上,接下来可以在 ECharts 中展示这些数据。以下是一个简单的 ECharts 配置示例:

var chart = echarts.init(document.getElementById('main'));  var option = {     tooltip: {         trigger: 'axis'     },     legend: {         data: ['今日能量', '总能量']     },     xAxis: {         type: 'category',         data: aggregatedStations[0].targets[0].produceTime     },     yAxis: {         type: 'value'     },     series: [         {             name: '今日能量',             type: 'line',             data: aggregatedStations[0].targets[0].data         },         {             name: '总能量',             type: 'line',             data: aggregatedStations[0].targets[1].data         },         {             name: '今日能量2',             type: 'line',             data: aggregatedStations[1].targets[0].data         },         {             name: '总能量2',             type: 'line',             data: aggregatedStations[1].targets[1].data         }     ] };  chart.setOption(option); 

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...