2012-06-06 35 views
3

我想在y軸上顯示三個標籤:minmiddlemax。最大 - 最小= 9572. 找到中間的最簡單的方法是二分之九千五百七十二= 4786.這些值不是很好所以Excel中可能會增加間隔1000,並設置middle爲500如何計算數值軸的主要單位

如何計算nice值對於我的y軸當minmax給出? min和/或max可能是負面的。

回答

2

好問題!最近,我最近解決了類似的問題,我做了什麼:

  1. 創建的可能步驟的陣列,像[1,2,5,10,20,25,50,75,100,200,250 ,500,750,1000,2000,2500,5000,7500,10000]
  2. 確定你需要多少標籤 - 我想是3
  3. 從數組中選擇一步。 9572 /(3-1)= 4786,最近的步距是5000.您可以將距離與下一步和前一步進行比較,並在此處進行自定義舍入,例如,如果非舍入步長比下一步小20%否則以前一個。
  4. 爲最小標籤選擇好看的起點。把你的實際最小值除以選定的步驟(5000)。舍入結果(您可以使用floor作爲最小值,ceil作爲最大值)並將其乘以所選步驟。例如,如果最小= -3400和max = 2700:

    scaleMin =地板(-3400/5000)* 5000 = -5000
    scaleMax =小區(2700/5000)* 5000 = 5000

這將給出三個標籤:-5000,0和5000.如果您可以容忍y軸上的最後一個標記低於圖的最大值,請不要只使用ceil(或floor)。計算多少百分比的圖表最大值超出標記,並且如果太多,則添加一個步驟。

0

可能有助於在C#中提供實現。我的示例可能不適用於負的y軸值。希望它能幫助別人!

private double GetMajorStep(double yAxisMax) 
    { 
     int[] stepArray = {1, 2, 5, 10, 20, 25, 50, 75, 100, 200, 250, 500, 750, 1000, 2000, 2500, 5000, 7500, 10000, 20000, 50000,100000, 500000,1000000}; 
     const int numLabels = 2; 
     var stepSize = (int) (yAxisMax/(numLabels - 1)); 
     var possibleSteps = stepArray.Where(p => p < stepSize).ToList(); 
     if (!possibleSteps.Any()) return stepSize; 

     var nearest = possibleSteps.OrderBy(x => Math.Abs((long)x - stepSize)).First(); 
     return nearest; 
    }