0

我有一个时间序列列表。每个时间序列都由包含时间戳和值的对象组成。不同时间序列的时间戳可能重叠也可能不重叠。我想在一个 DyGraph 中绘制这些时间序列。

一个例子:

    data["first series"]  = [{timestamp: 1, value: 10.3},
                             {timestamp: 3, value: 12.5}]
    data["second series"] = [{timestamp: 2, value: 11.5},
                             {timestamp: 3, value: 13.0},
                             {timestamp: 4, value: 14.3}]

将我的输入数据转换为适合 DyGraph 的形式的最有效方法是什么?

4

1 回答 1

2

我最近不得不为 dygraphs 项目做同样的事情。在较高级别上,您将需要创建一个组合数据集,以便在您的所有系列中每个唯一 x 值都有一行。对于在给定 x 处没有值的列/系列,您可以插入空值。

我将粘贴我在这里使用的一般代码。这是一个快速的复制粘贴,已经过大量修改,变量重命名等。它可能有一些小错误。我还在 dygraph 的 customBars 中使用了 min/max,这就是为什么粘贴的这段代码使用数组作为列,即使它可能不是必需的。

function combineSeries(seriesArr) {

  var dyDataRows = [];

  for (var seriesIdx = 0; seriesIdx < seriesArr.length; seriesIdx++) {

    var seriesData = seriesArr[seriesIdx];

    var newDyDataRows = [];

    var nextDataRowInsertIdx = 0;
    for (var dpIdx = 0; dpIdx < seriesData.length; dpIdx++) {
      var dp = seriesData[dpIdx];

      if (nextDataRowInsertIdx < dyDataRows.length) {
        var nextDataRowCols = dyDataRows[nextDataRowInsertIdx];
        var nextDataRowX = nextDataRowCols[0].getTime();
      }

      if (nextDataRowInsertIdx >= dyDataRows.length || dp.x < nextDataRowX) {
        var newDataRowCols = [new Date(dp.x)];
        for (var colIdx = 0; colIdx < seriesIdx; colIdx++) {
          newDataRowCols.push([null]);
        }
        newDataRowCols.push([dp.y]);
        newDyDataRows.push(newDataRowCols);
      }
      else if (dp.x > nextDataRowX) {
        var newDataRowCols = nextDataRowCols.slice(0);
        newDataRowCols.push([null]);
        newDyDataRows.push(newDataRowCols);
        nextDataRowInsertIdx++;
        dpIdx--;
      }
      else {//(dp.x == nextDataRowX) {
        var newDataRowCols = nextDataRowCols.slice(0);
        newDataRowCols.push([dp.y]);
        newDyDataRows.push(newDataRowCols);
        nextDataRowInsertIdx++;
      }

    }

    //insert any remaining existing rows
    for (var i = nextDataRowInsertIdx; i < dyDataRows.length; i++) {
      var nextDataRowCols = dyDataRows[i];
      var nextDataRowDateTm = nextDataRowCols[0];

      var newDataRowCols = nextDataRowCols.slice(0);
      newDataRowCols.push([null]);
      newDyDataRows.push(newDataRowCols);
    }

    dyDataRows = newDyDataRows;
  }

  return dyDataRows;
};

这是蛮力方法,并且可能有更有效的 JavaScript 编码技术。不过它对我有用。

于 2013-04-04T19:44:36.440 回答