2015-07-10 79 views
0

我需要通過給出一組值來爲圖上的圖例生成值。 是否有任何Java庫中的函數可以根據數組值和計數值生成範圍或隔離區?喜歡的東西:Java - 根據最小值,最大值和計數生成隔離區/間隔

Integer[] getIntervals(Number[] values , int count); 

用法示例:

getIntervals([10, 33.5, 45.98, 62, 77,80 ], 5)將返回[10, 24, 38, 52, 64, 80]

這是很容易由自己來寫,但它必須做聰明地表現出來不錯的傳奇地圖。智能我的意思是生成一個對傳說有意義的數字。我不知道如何用英文描述它,所以我附上了一張截圖,顯示了我的意思。

如果上述功能是我想要的智能方式,它會返回: [10, 30, 50, 70, 90]或類似的東西。

enter image description here

這仍然是我可以寫我自己,但也許這是冥冥中早已做了什麼?我查看了Apache Commons MathUtils和Apache Commons Math,但找不到我需要的東西。

編輯:我發現有在Apache共享一個Percentile類似乎是我需要使用,但我在數學上太弱了。

+1

目前還不清楚你在問什麼。爲什麼上面的陣列不比最下面的陣列好?你如何定義一個這樣的智能方法?根據我的理解,你需要一個生成數字列表的函數,每對鄰居(從左到右)與前一對具有較大的差異。 – Mackiavelli

+1

您是否想'getIntervals'來計算圖例中要使用的範圍?你希望範圍大小相等嗎?還是希望每個範圍內的值的數量儘可能均勻? – Simon

+0

是否存在符合你的主觀(和未公開)「智能」標準的東西?也許,但可能不會。 –

回答

1

您的問題需要解決,但我選擇將其解讀爲「我正在嘗試爲可視化目的的一系列輸入值創建很好的間隔滴答」。在這種情況下,我建議你長時間看how D3.js implements such scales。是的,Javascript不是Java--但是D3.js是一個衆所周知的可視化庫,你描述的問題是一個衆所周知的可視化問題,並且語法與Java相似 - 足以讓你很容易地適應這些想法。

簡而言之,並鬆散地平移:

public interface LinearScale { 
    /** 
    * build a scale from min to max; see d3 linear.domain() 
    * and then expand it to make it end in nice, round numbers; 
    * see d3 linear.nice() 
    */ 
    void setNiceDomain(double min, double max); 
    /** 
    * set number of threshold values; see d3 linear.ticks() 
    * and return their values 
    */ 
    double[] setThresholdCount(int ticks); 
    /** 
    * gets the largest threshold that is <= a given value 
    */ 
    double map(double value); 
} 

(JS)的源代碼可在https://github.com/mbostock/d3/blob/master/src/scale/linear.js; (從執行linear.ticks()):

function d3_scale_linearTickRange(domain, m) { 
    if (m == null) m = 10; 

    var extent = d3_scaleExtent(domain), 
     span = extent[1] - extent[0], 
     step = Math.pow(10, Math.floor(Math.log(span/m)/Math.LN10)), 
     err = m/span * step; 

    // Filter ticks to get closer to the desired count. 
    if (err <= .15) step *= 10; 
    else if (err <= .35) step *= 5; 
    else if (err <= .75) step *= 2; 

    // Round start and stop values to step interval. 
    extent[0] = Math.ceil(extent[0]/step) * step; 
    extent[1] = Math.floor(extent[1]/step) * step + step * .5; // inclusive 
    extent[2] = step; 
    return extent; 
} 

function d3_scale_linearTicks(domain, m) { 
    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); 
} 
+0

你看了我的腦海:) –

相關問題