样条系列中的高储存范围近似



我正在尝试使用HighStock绘制以250Hz采样的10秒钟的ECG信号,即2500点。我存在的问题是由于数据分组近似所致,并且信号的每个值在某些情况下可能与邻居有很大差异,因此,高仓库提供的任何近似功能都会导致绘制后的信号非常扭曲,因为在大多数情况下,最大值和最小值损失。我创建了一个JSFIDDLE(http://jsfiddle.net/yaubf/),显示了效果。只需将信号拖动以使组被重新计算并查看节拍的峰值。

解决此问题的一种解决方案是使用一个范围近似函数,该范围近似函数以两个点(最小值和最大值)表示每个组,但是我认为HighStock中目前尚无可用选项可以在样条线系列上执行此操作。即使您提供自己的近似功能,也必须返回一个点。

我认为应该可以通过提供我自己的近似函数,该功能返回最小和最大,以及修改seriesProto.groupData函数,其中应用分组和近似值以正确管理此结果

看代码我真的不知道该怎么做。

编辑:

正如Pawel在第一个答案中指出的那样,Arearange系列可能是保留微型猎人和Maximuns的选择。即便如此,我只需要绘制一个线或样条,而不是Y轴上有两个不同值的时间点的区域范围。然后,出现的问题是:可以编辑绘制Arearange系列的方式以获取一条线或带有所有数据的单线或样条,并在可能的情况下,我应该在源中查看/触摸?

我认为您可以简单地将串联类型更改为arearange,其中默认值相同。我升级了示例:

  • 更改数据格式:

    var data = getData();
    for(var i in data) {
        data[i] = [i, data[i], data[i]];   
    }
    
  • 设置不同的系列类型:

    series: [{
        type: 'arearange',
        pointInterval: 4, // 250Hz
        data: data,
        dataGrouping: {
            enabled: true
        },
        enabled: true
    }]
    

    和实时演示:http://jsfiddle.net/xzcwb/

最后,我设法以相当简单的方式解决了它。由于问题的解决方案基本上是用两个点表示每个组(最大值和最小值),因此我最终实现了一个自定义近似函数,该函数返回结果延迟点。也就是说,我等到有两组要近似的点,然后用所有这些点计算最小值和最大值。最后,我退还了第一个,并让另一个返回下一次迭代。这是功能代码:

approximation: function (arr) {
    // first time or point precalculated          
    if (!gInfo || gInfo.nextPoint) {
        // first time return first value (arr[0])
        var point = gInfo ? gInfo.nextPoint : arr[0];
        // save current data to the next iteration    
        gInfo = {
            prev: arr,
            nextPoint: null
        };
        return point;
    } else {
        var prev = gInfo.prev,
            // concat current group with the previous one
            data = prev.concat(arr),
            // get min, max and their positions        
            min = Math.min.apply(null, data),
            max = Math.max.apply(null, data),
            minIdx = data.indexOf(min),
            maxIdx = data.indexOf(max),
            // order min and max
            aprox = minIdx < maxIdx ? [min, max] : [max, min];
        // save next aproximation and return current
        gInfo.nextPoint = aprox[1];
        return aprox[0];
    }
}

我还设置了选项groupPixelWidth: .5,以允许创建更多的组,并且大约要少数点。

这是这种方法的实时示例http://jsfiddle.net/zw7d8/

最新更新