web-dev-qa-db-ja.com

ハイチャートでポイントのインデックスを取得するにはどうすればよいですか?

ハイチャートの「不規則な間隔の時間データ」チャートを使用しています。ご存知のように、マウスが線のポイント上を移動すると、フォーマッタ関数が実行され、いくつかの情報が表示されます。マウスがその上を移動するポイントのインデックスを知りたいです。したがって、マウスが線の最初のポイント上を移動すると、ツールチップには「1」が表示され、2番目のポイントには「2」が表示されます。 thnx。

17
Morteza

これはv2.2を使用して私のために働いた:

this.series.data.indexOf( this.point )
62
Edgar

1つの方法は、データを前処理して、インデックスを持つプロパティを含めることです。 Snow-depthの例では、次のような準備を行うことができます。

function prepare(dataArray) {
    return dataArray.map(function (item, index) {
        return {x: item[0], y: item[1], myIndex: index};
    });
};

[x, y]の配列を{ x: x, y: y, myIndex: i}のようなオブジェクトに変換します。次に、フォーマッタでそのインデックスを簡単に取得できます。

formatter: function() {
     return 'point ' + this.point.myIndex;
}

jsfiddle の例

12
eolsson

記録のためにあなたはそれを素晴らしい方法で直接行うことができます

それはで店です:

this.points[0].point.x
5
user789148

ポイントにアクセスできる場合は、簡単にアクセスできます。this.point.indexまたは単にthis.indexthisが自分自身でインデックスにアクセスするポイントを参照している場合、

私の場合、@ Edgarソリューションよりも単純であるため、常にこれを使用します。これも優れています。

3
Saif

データはソートされているので、 二分探索 を使用できます。

バイナリ検索は、多数のポイントに対してもうまく機能するはずです(ウィキペディアの記事から:「たとえば、100万アイテムのリストを検索するには、線形検索で100万回の反復が必要ですが、バイナリ検索で20回を超えないようにしてください。」

例:

var bsComparator = function(a, b) {
    if (a.x < b.x) { return -1; }
    if (a.x > b.x) { return 1; }
    return 0;
};
var binarySearch = function(series_data, point) {
    var low = 0, high = series_data.length - 1,
        i, comparison;
    while (low <= high) {
        i = Math.floor((low + high) / 2);
        comparison = bsComparator(series_data[i], point);
        if (comparison < 0) { low = i + 1; continue; }
        if (comparison > 0) { high = i - 1; continue; }
        return i;
    }
    return null;
};


tooltip: {
    formatter: function() {
        var pointIndex = binarySearch(this.series.data, this.point);
        return "Point index: " + pointIndex;
    }
}

(上記のbinarySearch関数は http://www.dweebd.com/javascript/binary-search-an-array-in-javascript/ に触発されています)

2
codeape

XAxis値(つまり時間)だけが必要なようです。使用:this.xData.indexOf(point.x)

this.pointsはより大きなシリーズにグループ化されるため、points [0] ... points [n]をさらに詳しく検索する必要があります。

1
danb201268326

これが、Highstock JSv4.2.4で私のために働いたすべてです。

var index = this.points[0].point.dataGroup.start;
1
coderama

これは、それが来るのと同じくらいハッキーであり、多くのポイントで地獄のように遅くなりますが、それは機能します。一般的な考え方は、現在のポイントに一致するポイントが見つかるまで、シリーズのデータ​​内のすべてのポイントを調べることです。

tooltip: {
     formatter: function() {
         for(var i=0;i<this.series.data.length;i++){
              var item = this.series.data[i];
              if(item.x == this.x && item.y == this.y)
               return 'point ' + i;
         }
         return 'not found'
     }
  }

実例: http://jsfiddle.net/Fuv4h/

0
Jamiec