2015-05-08 3 views
4

Использование Highstock картировать отсортированный временной ряд: [[timestamp, value], ...]Показать разрыв недостающих данных с Highstock

Источник данных оцифровывается с нерегулярными интервалами. В результате расстояния между двумя точками (по оси времени) изменяются.

Если две смежные точки разделены более 5 минут, я хочу показать пробел в диаграмме.

Использование опции gapSize не работает, поскольку не позволяет указать «размер» пробела как функцию времени.

Показывать пробелы уже является частью Highstock, мне просто нужно указать его как фиксированное количество времени (5 минут). Идеи?

Btw, кроме того, участок отлично работает.

ответ

4

Вот немного нечистый способ «манипулировать» gapSize работать так, чтобы его значение составляло миллисекунды, необходимые для создания пробела.

(function (H) { 
    // Wrap getSegments to change gapSize functionality to work based on time (milliseconds) 
    H.wrap(H.Series.prototype, 'getSegments', function (proceed) { 
     var cPR = this.xAxis.closestPointRange; 
     this.xAxis.closestPointRange = 1; 

     proceed.apply(this, Array.prototype.slice.call(arguments, 1)); 

     this.xAxis.closestPointRange = cPR; 
    }); 
}(Highcharts)); 

Это используется, что gapSize используется только в пределах getSegments функции (see source), и она работает на основе closestPointRange оси. Он обертывает getSegments, устанавливает closestPointRange в 1, вызывает исходный метод и затем сбрасывает closestPointRange в исходное значение.

С кодом выше вы могли бы сделать зазоры в течение 5 минут, как это:

plotOptions: { 
    line: { 
     gapSize: 300000 // 5 minutes in milliseconds 
    } 
} 

См this JSFiddle demonstration, как это может работать.

+1

Многие благодаря!!! Это действительно работает! – libbkmz

0

Halvor Strand function wrapper не работал для меня, пока getSegments не является частью highstock source code больше, чтобы рассчитать этот пробел. Во всяком случае, вы можете найти приближение для решения задачи комбинирования this other topic и previows ответить так:

(function(H) { 
    H.wrap(H.Series.prototype, 'gappedPath', function(proceed) { 
    var gapSize = this.options.gapSize, 
     xAxis = this.xAxis, 
     points = this.points.slice(), 
     i = points.length - 1; 

    if (gapSize && i > 0) { // #5008 

     while (i--) { 
     if (points[i + 1].x - points[i].x > gapSize) { // gapSize redefinition to be the real threshold instead of using this.closestPointRange * gapSize 
      points.splice(// insert after this one 
      i + 1, 
      0, { 
       isNull: true 
      } 
     ); 
     } 
     } 
    } 
    return this.getGraphPath(points); 
    }); 
}(Highcharts)) 

установка gapSize в plotOptions до нужного размера (в мс), как Halvor сказал:

plotOptions: { 
    line: { 
    gapSize: 300000 // 5 minutes in milliseconds 
    } 
} 
Смежные вопросы