我正在尝试使用Highstock绘制10秒的250Hz采样的ECG信号,即2500点。我遇到的问题是由于数据分组近似,以及在某些情况下信号的每个值可能与其邻居有很大差异的事实,因此Highstock提供的任何近似函数在绘制后都会导致信号失真,因为在大多数情况下,最大值和最小值都会丢失。我创建了一个显示效果的jsFiddle(http://jsfiddle.net/YaubF/)。只需拖动信号即可重新计算组,并查看节拍的峰值。
这个问题的一个解决方案是使用范围近似函数来表示每个组有两个点(最小值和最大值),但我认为Highstock目前没有可用的选项来在样条序列上执行此操作。即使您提供自己的近似函数,也必须返回一个单点。
我认为应该可以通过提供我自己的近似函数来实现这一点,该函数返回min和max ,以及修改seriesProto.groupData
函数,其中分组和近似应用于妥善管理此结果。
查看代码我真的不知道该怎么做。
编辑:
Pawel在第一个答案中指出,区域范围系列可以选择保留最小值和最大值。即便如此,我还是只绘制一条直线或样条曲线,而不是在y轴上绘制具有两个不同值的时间点的区域范围。然后,出现的问题是:是否可以编辑区域范围系列的绘制方式以获得包含所有数据的单个行或样条线?如果可能,我应该在源中查找/触摸?
答案 0 :(得分:1)
我认为您可以简单地将系列类型更改为区域范围,其中默认值相同。我已升级了示例:
更改数据格式:
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
}]
答案 1 :(得分:0)
最后,我设法以一种相当简单的方式解决它。由于问题的解决方案基本上是用两个点(最大值和最小值)表示每个组,我最终实现了一个自定义近似函数,该函数返回一个点延迟的结果。也就是说,我等到我有两组要近似的点,然后我用它们计算最小值和最大值。最后,我返回第一个并保持另一个在下一次迭代中返回。这是功能代码:
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/