首页 > 解决方案 > 以 1 分钟间隔生成随机数据:Highcharts

问题描述

我创建了一个样条实时图表,我想在其中定期显示点。

每个点都是一分钟后发生的事件。但是,我很难理解所有动人的部分:

  1. 我提到的 highchart 演示中的间隔函数每 1 秒更新一次,我已经达到了 6000。

  2. javascript中的虚拟更新只需要最新时间并附加它,是否应该在那里引入一些延迟?

  3. 系列中的虚拟初始化数据有一个我无法理解的 for 循环。我知道 javascript 会生成一个 UNIX 时间戳及其毫秒操作,但是默认代码(再次从 highchart 演示中稍作修改)从 -9999 运行到 0 并乘以一个数字。

我想了解这些部分,并确保每次我的 x 轴向右“滴答”时,我都有一分钟的差距,并且在图表上只有一个点。

PS:请原谅任何遗漏的括号,它们可能在发布问题时遗漏了,但我向您保证这不是问题。

这是我的系列代码:

           series: [{
                type: 'spline',
                name: 'Random data',
                data: (function () {
                    // generate an array of random data
                    var data = [],
                        time = (new Date()).getTime(),
                        i;

                    for (i = -9999; i <= 0; i += 1) {
                        data.push([
                            time + i * 60000,
                            Math.round(Math.random() * 100) + 10
                        ]);
                    }
                    return data;
                }())
            }]

这是我的图表代码:

chart: {
 events: {
           load: function () {

             // Set up the updating 
             var series = this.series[0];

             setInterval(function () {
               var x = (new Date()).getTime(), // current time
               y = Math.round(Math.random() * 100) + 10

               series.addPoint([x, y], true, true);
             }, 6000);
           }
         }
       }

标签: highcharts

解决方案


至于你的问题:

  1. 如果你想有 1 分钟的数据间隔,你需要使用60000value (60 * 1000),6000毫秒为 6 秒。

  2. 间隔函数中的当前日期每6000毫秒计算一次,这会导致数据每6000毫秒出现一次间隔。

  3. 该数据初始化取决于从当前时间戳中减去六秒的倍数:


data: (function() {
    // generate an array of random data
    var data = [],
        time = (new Date()).getTime(),
        i;

    for (i = -9999; i <= 0; i += 1) {
        if (i === -500) {
            console.log(time, i, 60000); // 1560941909847 + (-500 * 60000)
            console.log(time + i * 60000); // 1560911909847
        } else if (i === -499) {
            console.log(time, i, 60000); // 1560941909847 + (-499 * 60000)
            console.log(time + i * 60000); // 1560911969847
        } else if (i === 0) {
            console.log(time, i, 60000); // 1560941909847 + (0 * 60000)
            console.log(time + i * 60000); // 1560941909847 = actual time
        }
        data.push([
            time + i * 60000,
            Math.round(Math.random() * 100) + 10
        ]);
    }
    return data;
}())

推荐阅读