2011-12-14 42 views
16

Tôi đang sử dụng biểu đồ "Thời gian dữ liệu với khoảng thời gian không đều" của Highcharts. Như bạn đã biết khi chuột di chuyển qua các điểm của dòng, hàm định dạng chạy và hiển thị một số thông tin. Tôi muốn biết chỉ số của điểm mà con chuột di chuyển qua nó. Vì vậy, nếu di chuột qua điểm đầu tiên của dòng, chú giải công cụ hiển thị "1" và điểm thứ hai hiển thị "2", v.v. thnx.Làm cách nào để lấy chỉ mục của một điểm trong Highcharts?

+2

câu trả lời của Edgar dường như là tốt nhất, không cần chế biến. –

Trả lời

58

Điều này làm việc cho tôi bằng cách sử dụng v2.2:

this.series.data.indexOf(this.point) 
+0

Làm việc cho tôi. Đơn giản! –

+3

tuyệt vời, ngắn gọn và đơn giản !!!. mặc dù tôi không nghĩ rằng bạn cần ** this.point ** (trong ngoặc đơn), chỉ ** này ** –

+0

Đây phải là câu trả lời được chấp nhận. Câu trả lời được chấp nhận là một hack xấu xí. –

0

Đây là về hacky như nó đến, và sẽ nhận được chậm như địa ngục với rất nhiều điểm, nhưng nó sẽ làm việc. Ý tưởng chung là để xem xét thông qua tất cả các điểm trong dữ liệu của series cho đến khi bạn tìm ra một phù hợp với điểm hiện tại:

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

Sống dụ: http://jsfiddle.net/Fuv4h/

+0

Đây chính xác là những gì tôi muốn. Nhưng như bạn đã đề cập đến mã này mất rất nhiều thời gian để thực hiện đặc biệt khi dòng có đầy đủ các điểm. BTW Tôi cảm ơn bạn. – Morteza

11

Một cách là trước xử lý dữ liệu để chứa một thuộc tính với chỉ mục. Trong ví dụ Tuyết sâu bạn có thể làm một sự chuẩn bị như thế này:

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

để chuyển đổi hàng loạt các [x, y] trở thành một đối tượng như { x: x, y: y, myIndex: i}. Sau đó, nó dễ dàng để nhận thấy chỉ số trong định dạng với:

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

Ví dụ trên jsfiddle

+1

Mã này có vẻ nhanh hơn. Tôi thử nghiệm nó trong dự án của tôi Ngay khi có thể. Thnx eolsson. – Morteza

+0

Có, nó sẽ nhanh hơn tìm kiếm chỉ mục, nhưng sẽ sử dụng nhiều bộ nhớ hơn. – eolsson

+1

Wow ..Bây giờ tôi đã biết rằng tôi có thể thêm các thuộc tính khác ngoài tên, x, y, lưu ý trong mảng đối tượng. 1 cho rằng –

4

Đối với hồ sơ của bạn có thể làm điều đó trực tiếp trong một cách tốt đẹp

Đó là cửa hàng ở:

this.points[0].point.x 
+0

Điều này làm việc cho tôi, không chắc chắn lý do tại sao bạn đã downvoted. – MightyPork

+0

Tôi có thể cho bạn biết chính xác lý do tại sao điều này đã được giảm giá: bởi vì nó dựa vào nội dung của X là một chỉ mục. Trong trường hợp của tôi X là một ngày, vì vậy tôi đã có ngày. Tuy nhiên bằng cách sử dụng 'seriesMapping' tôi ánh xạ cột thứ ba của CSV của tôi đến một chỉ mục thực tế và sau đó truy cập nó bằng cách sử dụng dòng này :) +1 từ tôi –

1

Vì dữ liệu được sắp xếp, bạn có thể sử dụng binary search.

Tìm kiếm nhị phân sẽ hoạt động tốt ngay cả đối với số điểm lớn (từ bài viết wikipedia: "Ví dụ: để tìm kiếm danh sách một triệu mục mất nhiều triệu lần lặp với tìm kiếm tuyến tính, nhưng không bao giờ nhiều hơn hai mươi lặp với tìm kiếm nhị phân "

Ví dụ:.

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

(chức năng binarySearch trên được lấy cảm hứng từ http://www.dweebd.com/javascript/binary-search-an-array-in-javascript/)

1

Sou giống như bạn chỉ cần giá trị xAxis (tức là thời gian). Sử dụng: this.xData.indexOf(point.x)

this.points sẽ được nhóm thành chuỗi lớn hơn để tìm kiếm sâu hơn thông qua các điểm [0] ... điểm [n].

1

Đây là tất cả những gì làm việc cho tôi trên Highstock JS v4.2.4:

var index = this.points[0].point.dataGroup.start; 
Các vấn đề liên quan