我正在尝试使用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/