2010-08-24 64 views
0

我正在開發一個直方圖容器類,我試圖確定哪些切割點應該用於垃圾箱。我希望截點是很好看的數字,就像圖表縮放的方式一樣。C#日期/數值軸比例

將我的請求提煉成一個基本問題:是否有一種基本方法可以根據數字列表確定數據軸標籤。

例如:

Array{1,6,8,5,12,15,22} 

這將是有意義的有5個箱。

Bin Start Count 
0    1 
5    3 
10    2 
15    0 
20    1 

bin開始的東西與在這個例子中在圖上選擇軸標籤是一樣的。

對於這個問題我真的不關心箱和直方圖的目的,我更感興趣的問題的圖刻度軸標籤部分。

我將爲我的應用程序使用C#4.0,因此歡迎使用linq的漂亮解決方案。

我已經嘗試這樣的東西在使用一些底數10縮放東西遙遠的過去,但我從來沒有得到它在足夠大的細節工作,這種應用。我不想做日誌縮放,我只是用10來湊到最接近的整數。我希望它能適用於大數量和非常小的數字,並且可能還有日期。儘管日期可以轉換爲雙打併以這種方式進行解析。

關於這個問題的任何資源將不勝感激。

回答

0

你可以用一些簡單的開始:

NUM_BINS is a passed argument or constatn (e.g. NUM_BINS = 10) 
x is your array of x-values (e.g. int[] x = new int[50]) 

int numBins = x.Length < NUM_BINS ? x.Length : NUM_BINS; 

在這一點上,你可以calc下xPoints的直方圖,如果xPoints的權重較大,以分配的一側(也許只是計數離開中點的對比右邊的中點),然後在x []範圍內使用log/exp分割。如果直方圖是平坦的,則使用線性分割。

double[] xAxis = new double[numBins]; 
double range = x[x.Length-1] - x[0]; 
CalcAxisValues(xAxis, range, TYPE); //Type is enum of LOG, EXP, or LINEAR 

這個函數然後會根據TYPE來平分空間點。