2015-09-17 33 views
1

我試圖動態添加/刪除yAxis,但是我觀察到性能問題。它需要一秒多的時間(有時會持續4秒),以動態地將一個系列添加或刪除到新的yAxis中。我需要在圖表中加載結束日期數據(每天的價格點)10年或更長時間。動態添加yAxis時Highcharts性能低下

任何改善表現的建議都將非常感激。

幾點需要注意 -

  1. 我可以使用不同類型的圖表(線,OHLC,燭臺,面積等)
  2. 我需要鼠標跟蹤爲我使用的單擊事件啓用該系列。
  3. 用戶可以選擇應用數據分組或不應用。

下面是我的代碼示例來說明問題。

var chart; 
 
var index = 2; 
 

 
var groupingUnitsD = {units:[['day',[1]]], enabled:true}; 
 
var groupingUnitsWM = [[ 
 
     'week',       // unit name 
 
     [1]        // allowed multiples 
 
    ], [ 
 
     'month', 
 
     [1, 2, 3, 4, 6] 
 
    ]]; 
 
$(function() { 
 
    var ohlc = []; 
 
    
 
    $.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-ohlcv.json&callback=?', function (data) { 
 

 
    // split the data set into ohlc 
 
    var volume = [], 
 
    dataLength = data.length, 
 
    
 
    i = 0; 
 

 
    for (i; i < dataLength; i++) { 
 
     ohlc.push([ 
 
      data[i][0], // the date 
 
      data[i][1], // open 
 
      data[i][2], // high 
 
      data[i][3], // low 
 
      data[i][4] // close 
 
     ]); 
 
    } 
 
    
 
    loadChart(data); 
 
    }); 
 
    
 
    
 
    function loadChart(cdata){ 
 
     var highchartOptions = { 
 
     plotOptions:{ 
 
      line: { 
 
       enableMouseTracking: true, 
 
       animation:false, 
 
       marker: { 
 
        enabled: false 
 
       } 
 
      }, 
 
      series:{ 
 
     \t cursor: 'pointer', 
 
      } 
 
     }, 
 
     chart:{ 
 
      renderTo:'container' 
 
     }, 
 
     navigator: { 
 
      outlineColor: '#0066DD', 
 
      outlineWidth: 1 
 
     }, 
 
     xAxis: [{ 
 
     
 
     gridLineWidth: 1, 
 
     gridLineColor: "#eaf5ff", 
 
     lineColor: '#FF0000', 
 
      lineWidth: 1 
 
     }], 
 
     yAxis:[{ 
 
      title:{ 
 
      text:"initial data" 
 
      }, 
 
      id:'myaxis-1', 
 
      height:'14%', 
 
      top:'0%' 
 
     }], 
 

 
     series: [{ 
 
      data: cdata, 
 
      turboThreshold:0, 
 
      dataGrouping:groupingUnitsD 
 
     }] 
 
     }; 
 
     chart = new Highcharts.StockChart(highchartOptions); 
 
    } 
 
    
 
    
 
    
 
    
 
    $button = $('#button'); 
 
    $delButton = $('#delbutton'); 
 
    
 
    $button.click(function() { 
 
      var axisObj = { 
 
      title: { 
 
       text: "axis-" + index, 
 
      }, 
 
      id:'myaxis-'+ index 
 
      }; 
 
     chart.addAxis(axisObj, false); 
 
     console.log("Added axis:" + 'myaxis-'+ index); 
 
     $('#axisList').append($('<option></option>').text('myaxis-'+ index)); 
 
     var seriesData = new Object(); 
 
     seriesData.name = 'axis-' + index; 
 
     seriesData.id = 'myaxis-' + index; 
 
     seriesData.yAxis = 'myaxis-'+ index; 
 
     seriesData.data = ohlc; 
 
     seriesData.type = 'line'; 
 
     seriesData.dataGrouping = groupingUnitsD; 
 
     chart.addSeries(seriesData); 
 
     updateAxisHeight(); 
 
     index++; 
 
    }); 
 
    
 
    
 
    $delButton.click(function() { 
 
    
 
    var $select = $('#axisList'); 
 
    console.log($select.val()); 
 
    console.log(chart.get($select.val())); 
 
    var selId = $select.val(); 
 
    
 
    chart.get(selId).remove(); 
 
    $('option:selected', $select).remove(); 
 
    var i=0; 
 
    updateAxisHeight(); 
 
    }); 
 
    
 
    updateAxisHeight = function(){ 
 
    
 
    var i=0; 
 
    $("#axisList > option").each(function() { 
 
     chart.get(this.value).update({ height: '14%',top: (i*15) + '%',offset:0 }); 
 
     i++; 
 
    }); 
 
    } 
 
    
 
    
 
    
 

 
});
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 
 
    <script src="http://code.highcharts.com/stock/highstock.js"></script> 
 
    <script src="http://code.highcharts.com/stock/highcharts-more.js"></script> 
 
    <script src="http://code.highcharts.com/modules/exporting.js"></script> 
 

 
<button id="button" class="autocompare">Add yAxis</button><br> 
 
<!--Entrt yAxis index to delete:<input type='text' id="delAxis"/> --> 
 

 
<select id="axisList" name="axisList"> 
 
    <option value="myaxis-1" selected="selected">myaxis-1</option> 
 
</select> 
 

 

 
<button id="delbutton" class="autocompare">Delete yAxis</button> 
 
<div id="container" style="height: 800px"></div>

+1

數據點是在該示例中明顯高。檢查你的JSON響應哪些字段是JSON的一部分。我的意思是你的json響應應該只有必填字段(假設只有時間戳和值)。如果json也有其他字段,請刪除它們,因爲內容下載(服務器返回響應後)可能需要時間另一種選擇是:您可以使用懶惰加載在highcharts(可在演示:170萬點與異步加載http://www.highcharts.com/stock/demo/lazy-loading –

+0

感謝您的響應,但在例子中,如果你嘗試添加第二個yAxis它重用相同的下載數據,你仍然會看到延遲,還有什麼其他的方法可以提高yAxis渲染時間,我想在這裏重點關注高性能的改進,而不是數據下載的時間。 – Amit

回答

0

可以顯著提高在這種情況下有一個絕招性能:在執行多個連續操作時,每個需要重繪(加系列,加軸,更新軸高度),唐't重繪,直到您告訴Highcharts約全部的操作。

在我的機器上,這使您的添加軸功能的性能提高了5倍-6倍。請參閱下面的代碼和評論。

var chart; 
 
var index = 2; 
 

 
var groupingUnitsD = {units:[['day',[1]]], enabled:true}; 
 
var groupingUnitsWM = [[ 
 
     'week',       // unit name 
 
     [1]        // allowed multiples 
 
    ], [ 
 
     'month', 
 
     [1, 2, 3, 4, 6] 
 
    ]]; 
 

 
$(function() { 
 
    var ohlc = []; 
 
    
 
    $.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-ohlcv.json&callback=?', function (data) { 
 

 
    // split the data set into ohlc 
 
    var volume = [], 
 
    dataLength = data.length, 
 
    
 
    i = 0; 
 

 
    for (i; i < dataLength; i++) { 
 
     ohlc.push([ 
 
      data[i][0], // the date 
 
      data[i][1], // open 
 
      data[i][2], // high 
 
      data[i][3], // low 
 
      data[i][4] // close 
 
     ]); 
 
    } 
 
    
 
    loadChart(data); 
 
    }); 
 
    
 
    
 
    function loadChart(cdata){ 
 
     console.time("chart load"); 
 
     var highchartOptions = { 
 
     plotOptions:{ 
 
      line: { 
 
       enableMouseTracking: true, 
 
       animation: false, 
 
       marker: { 
 
        enabled: false 
 
       } 
 
      }, 
 
      series:{ 
 
     \t cursor: 'pointer', 
 
      } 
 
     }, 
 
     chart:{ 
 
      alignTicks: false, 
 
      events: { 
 
      load: function() { 
 
       console.timeEnd("chart load"); 
 
      } 
 
      }, 
 
      renderTo:'container' 
 
     }, 
 
     yAxis:[{ 
 
      title:{ 
 
      text:"initial data" 
 
      }, 
 
      id:'myaxis-1', 
 
      height:'14%', 
 
      top:'0%' 
 
     }], 
 

 
     series: [{ 
 
      data: cdata, 
 
      turboThreshold:0, 
 
      dataGrouping:groupingUnitsD 
 
     }] 
 
     }; 
 
     chart = new Highcharts.StockChart(highchartOptions); 
 
    } 
 
    
 
    
 
    
 
    
 
    $button = $('#button'); 
 
    $delButton = $('#delbutton'); 
 
    
 
    $button.click(function() { 
 
     var startTime = new Date().getTime(); 
 
      var axisObj = { 
 
      title: { 
 
       text: "axis-" + index, 
 
      }, 
 
      id:'myaxis-'+ index 
 
      }; 
 
     chart.addAxis(axisObj, false, false); // don't redraw yet 
 
     console.log("Added axis:" + 'myaxis-'+ index); 
 
     $('#axisList').append($('<option></option>').text('myaxis-'+ index)); 
 
     var seriesData = new Object(); 
 
     seriesData.name = 'axis-' + index; 
 
     seriesData.id = 'myaxis-' + index; 
 
     seriesData.yAxis = 'myaxis-'+ index; 
 
     seriesData.data = ohlc; 
 
     seriesData.type = 'line'; 
 
     seriesData.dataGrouping = groupingUnitsD; 
 
     chart.addSeries(seriesData, false);  // don't redraw yet 
 
     updateAxisHeight(false);     // don't redraw yet 
 
     index++; 
 

 
     // finally, redraw now 
 
     chart.redraw(); 
 

 
     var endTime = new Date().getTime(); 
 
     console.log("add axis took " + (endTime - startTime) + " msec"); 
 
    }); 
 
    
 
    
 
    $delButton.click(function() { 
 
    
 
    var $select = $('#axisList'); 
 
    console.log($select.val()); 
 
    console.log(chart.get($select.val())); 
 
    var selId = $select.val(); 
 
    
 
    chart.get(selId).remove(); 
 
    $('option:selected', $select).remove(); 
 
    var i=0; 
 
    updateAxisHeight(); 
 
    }); 
 
    
 
    updateAxisHeight = function(redraw){ 
 
    // set redraw to true by default, like Highcharts does 
 
    if (typeof redraw === 'undefined') { 
 
     redraw = true; 
 
    } 
 
    
 
    var i=0; 
 
    $("#axisList > option").each(function() { 
 
     // don't redraw in every iteration 
 
     chart.get(this.value).update({ height: '14%',top: (i*15) + '%',offset:0 }, false); 
 
     i++; 
 
    }); 
 

 
    // redraw if caller asked to, or if the redraw parameter was not specified 
 
    if (redraw) { 
 
     chart.redraw(); 
 
    } 
 
    } 
 
    
 
    
 
    
 

 
});
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 
 
    <script src="http://code.highcharts.com/stock/highstock.js"></script> 
 
    <script src="http://code.highcharts.com/stock/highcharts-more.js"></script> 
 
    <script src="http://code.highcharts.com/modules/exporting.js"></script> 
 

 
<button id="button" class="autocompare">Add yAxis</button><br> 
 
<!--Entrt yAxis index to delete:<input type='text' id="delAxis"/> --> 
 

 
<select id="axisList" name="axisList"> 
 
    <option value="myaxis-1" selected="selected">myaxis-1</option> 
 
</select> 
 

 

 
<button id="delbutton" class="autocompare">Delete yAxis</button> 
 
<div id="container" style="height: 800px"></div>