2013-05-28 35 views
0

我已經添加了縮放到我正在處理的高分辨率應用程序,但是當縮放時我注意到了一些非常不好的行爲。如果縮放窗口包含圖表的數據範圍之外的區域,結果縮放級別錯誤地忽略該區域。對不起,如果這有點不清楚,我不確定如何最好地解釋它。如何避免不良行爲縮放到數據範圍之外的區域

這裏的一個小提琴展示了此問題:http://jsfiddle.net/rnAEB/

$(function() { 
    chart = new Highcharts.Chart({ 

     chart: { 
      renderTo: "container", 
      zoomType: "xy" 
     }, 

     title: { 
      text: 'Try zooming outside the data range' 
     }, 

     tooltip: { 
      headerFormat: '<b>{series.name}</b><br />', 
      pointFormat: 'x = {point.x}, y = {point.y}' 
     }, 

     series: [{    
      data: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512], 
      pointStart: 1 
     }] 
    }); 

    chart.xAxis[0].setExtremes(-10, 20, true); 
    chart.yAxis[0].setExtremes(-500, 1000, true); 
}); 

嘗試從(5,1000)放大到矩形(10,-500)。由此產生的縮放區域大約(5,600)到(10,-100)...這顯然不是要求的縮放請求。

我已經嘗試連接到軸的setExtremes事件,並且發生此問題時的界限未定義。但我無法弄清楚如何'劫持'setExtremes請求來修復未定義的值。我也不能從該事件中遞歸調用setExtremes。

這是預期的行爲?我可以看到爲什麼你只想放大數據的位置 - 但我真的很喜歡爲了透視而放大到沒有數據的位置的自由。

回答

0

它與自己的形式(兩個axss中的最小值/最大值)生成「啓動圖表」相關,然後調用setExtrems,這是唯一的事件,稱爲一次。所以圖表不能「記住」新的極端。因此,您可以使用setExtremes中的數字和事件來定義最小/最大值。

http://jsfiddle.net/rnAEB/1/

xAxis:{ 
      min:-10, 
      max:20 
     }, 
     yAxis:{ 
      min:-500, 
      max:1000 
     }, 
+0

考慮到它的行爲,這是一個好方法。我想動態縮放圖表,所以提前設置邊界對我來說不起作用。我確實設法通過重寫軸縮放方法來做到這一點(暫時將其張貼爲答案)。 – Michael

2

看來,這是預期的行爲。在highcharts源戳,使我具有以下條件的Highcharts.Axis.prototype.zoom方法:

// Prevent pinch zooming out of range 
    if (!this.allowZoomOutside) { 
     if (newMin <= this.dataMin) { 
      newMin = UNDEFINED; 
     } 
     if (newMax >= this.dataMax) { 
      newMax = UNDEFINED; 
     } 
    } 

我試着使用配置選項設置「allowZoomOutside」選項,但遺憾的是沒有我可以弄明白(或者在源代碼中找到)的無證鉤子。

根據源代碼中的註釋,縮放方法旨在被覆蓋(他們特別提及股票圖表),我寧願避免嘗試從外部手動設置'allowZoomOutside',並希望它不會得到被一些內部機制所抹去。重寫版本缺乏這種檢查就像一個魅力。這裏有一個更新的小提琴作爲例子:http://jsfiddle.net/7XHMz/

如果任何人都可以找出如何正確設置'allowZoomOutside'選項,雖然這可能是最好的方式來做到這一點。

+0

試試這個:'$ .each(chart.yAxis,function(i,axis){axis.allowZoomOutside = true;});' –