2013-08-09 47 views
5

Tôi có hàng chục nghìn (có thể là hàng trăm nghìn) điểm mà tôi cần vẽ bằng Highcharts. Có cách nào tôi có thể nhóm dữ liệu trên máy chủ, vì vậy nó sẽ hiển thị ít hơn 1000 điểm, nhưng khi bạn phóng to nó sẽ thực hiện cuộc gọi AJAX đến máy chủ để lấy dữ liệu cho vùng được thu phóng đó (có thể nó sẽ chạy qua cùng một thuật toán cụm). Giao diện này sẽ như thế nào với API Highcharts?Highcharts tập hợp dữ liệu lớn nhóm

+0

Tôi đoán tôi sẽ phải bắt 'sự kiện selected', sau đó bật lên một màn hình tải, sau đó AJAX Call, sau đó loại bỏ dữ liệu và thêm dữ liệu mới, nhưng làm thế nào sẽ là phóng to làm việc, bởi vì phương pháp này sẽ không tính đến điều đó. – Ray

+1

Thực ra, tôi nghĩ^điều đó có thể hiệu quả. Tôi nghĩ rằng nó sẽ chiếm tỷ lệ thu phóng vì các trục sẽ cập nhật. Tôi chỉ cần hiển thị nút Đặt lại thu phóng để hiển thị dữ liệu gốc. – Ray

Trả lời

2

Dưới đây là một cải tiến cho câu trả lời của Barbara,

Nó đăng ký sự kiện setExtremes, biết nếu điều này là một sự kiện thiết lập lại zoom. Nếu có - nó sẽ lấy toàn bộ tập dữ liệu, do đó cho phép thu phóng đặt lại hoạt động chính xác.

Nó cũng cho phép phóng to cả x và y.

http://jsfiddle.net/DktpS/8/

var isReset = false; 

... 

      xAxis: { 
       events: { 
         afterSetExtremes : afterSetExtremes, 
        setExtremes: function (e) { 


         if (e.max == null || e.min == null) { 
          isReset = true;        
         } 
         else 
         { 
         isReset = false; 
         } 
        } 
       }, 
       minRange: 3600 * 1000 // one hour 
      }, 

      series: [{ 
       data: data, 
       dataGrouping: { 
        enabled: false 
       } 
      }] 
     }); 
    }); 
}); 


    /** 
    * Load new data depending on the selected min and max 
    */ 
    function afterSetExtremes(e) { 

     var url, 
     currentExtremes = this.getExtremes(), 
      range = e.max - e.min; 
     var chart = $('#container').highcharts(); 

     var min = 0; 
     var max = 1.35e12; 
     if(!isReset) 
     { 
      min = e.min; 
      max = e.max; 
     } 
     chart.showLoading('Loading data from server...'); 
     $.getJSON('http://www.highcharts.com/samples/data/from-sql.php?start=' + Math.round(min) + 
      '&end=' + Math.round(max) + '&callback=?', function (data) { 

      chart.series[0].setData(data); 

      chart.hideLoading(); 


     }); 

    } 
3

Có bản giới thiệu highstock làm điều này http://www.highcharts.com/stock/demo/lazy-loading. Nhưng bạn có thể làm điều tương tự với highcharts http://jsfiddle.net/RHkgr/ Các bit quan trọng là afterSetExtremes hoạt

... 
      xAxis : { 
       events : { 
        afterSetExtremes : afterSetExtremes 
       }, 
... 


/** 
* Load new data depending on the selected min and max 
*/ 
function afterSetExtremes(e) { 

    var url, 
     currentExtremes = this.getExtremes(), 
     range = e.max - e.min; 
    var chart = $('#container').highcharts(); 
    chart.showLoading('Loading data from server...'); 
    $.getJSON('http://www.highcharts.com/samples/data/from-sql.php?start='+ Math.round(e.min) + 
      '&end='+ Math.round(e.max) +'&callback=?', function(data) { 

     chart.series[0].setData(data); 
     chart.hideLoading(); 
    }); 

} 
+1

Trên một lưu ý khác, jsfiddle đó không hoạt động đúng, hãy thử phóng to rồi đặt lại. Nó cần phải nạp lại dữ liệu gốc – Ray

0

Trong trường hợp khi bạn sẽ không có một giới hạn của điểm, bạn có thể tăng turboThreshold paramter.

+0

Tôi đã thử điều đó, và nó không thực tế vì tôi phải hỗ trợ IE8: "( – Ray

+0

Bạn có nghĩa là turbothreshold không hoạt động trong IE8? Bạn có thể tạo lại ví dụ của mình trong jsfiddle.net không? –

+0

Không, IE8 không xử lý nhiều đối tượng tốt, nó sẽ hỏi bạn rất nhiều lần nếu bạn muốn tiêu diệt kịch bản – Ray

Các vấn đề liên quan