2014-01-23 3 views
3

저는 Highstock을 사용하여 250Hz에서 샘플링 된 ECG 신호의 10 초, 즉 2500 포인트를 그려 봅니다. 내가 가진 문제는 데이터 그룹화 근사 및 신호의 각 값이 인접한 경우와 크게 다를 수 있기 때문에 Highstock에서 제공하는 근사 함수 중 하나가 그림 이후에 매우 왜곡 된 신호가됩니다. 대부분의 경우 최대 값과 최소값이 손실됩니다. 그 효과를 보여주는 jsFiddle (http://jsfiddle.net/YaubF/)을 만들었습니다. 신호를 드래그하여 그룹을 다시 계산하고 비트의 피크를 봅니다.스플라인 계열의 하이 스톡 범위 aproximation

이 문제에 대한 한 가지 해결책은 각 그룹을 2 점 (최소값과 최대 값)으로 나타내는 범위 근사 함수를 사용하는 것이지만 현재는 Highstock에서 스플라인 시리즈에 사용할 수있는 옵션이 없다고 생각합니다. 자신의 근사 함수를 제공하더라도 결과적으로 단일 점을 반환해야합니다.

나는 그룹화 및 근사 제대로이 결과를 관리하는 데 적용되는 seriesProto.groupData 기능을 수정 분, 최대 및 을 반환 내 자신의 대략적인 기능을 제공 하여이를 구현할 수 있어야한다고 생각합니다.

코드를 보면 정말 어떻게하는지 모릅니다. 그래서 도움이 될 것입니다!

편집 : 파블가 첫 번째 대답에서 지적한대로

, arearange 시리즈는 minimuns 및 maximuns을 보존 할 수있는 옵션이 될 수 있습니다. 그렇더라도, y 축에 두 개의 서로 다른 값을 가진 시간 범위가있는 영역 범위가 아닌 라인 또는 스플라인 만 그려야합니다. 그런 다음 발생하는 질문은 다음과 같습니다. 모든 데이터가있는 단일 라인 또는 스플라인을 얻으려고 arearange 시리즈를 그릴 수 있습니까? 가능하면 출처를보고 터치해야하는 곳이 있습니까?

+0

의 라이브 예를 들어, 당신은 꽤 꾸준히 차트를 얻을 수 있습니다,하지만 난 당신을 위해 충분히 그 정확한 있는지 확실하지 않습니다. http://api.highcharts.com/highstock#plotOptions.spline.dataGrouping.approximation – gpgekko

+0

예를 들어 데이터에 적용되는 내용은 사실이지만 픽업이 작동하지 않는 다른 시리즈는 – roispiper

답변

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/

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 
    }] 
    

    그리고 라이브 데모 : 마지막으로 http://jsfiddle.net/xzcwB/

+0

이 해결책이라고 생각합니다. 신호의 더 평평한 부분과 최고점에서 받아 들여질 수 있습니다. 왜냐하면 적어도 최소값과 최대 값이 보존되기 때문에, 폴드는 여전히 매우 왜곡되어 있기 때문입니다. 어차 랭지에서 약간의 조정이 더 나은 결과를 낼 수도 있지만, 충분히 정확하지는 않을 것이라고 생각합니다. – roispiper

+0

그 해결책이 효과가 없다면, 실제로 소스를 편집해야합니다. –

관련 문제