2012-03-06 283 views
1

在Excel 2010中,列A中的值列表中的值和B1中指定的bin大小。這讓我使用這個公式N個頻點創建直方圖:使用Excel FREQUENCY函數的直方圖

{=FREQUENCY(A:A,(ROW(INDIRECT("1:"&CEILING((MAX(A:A)-MIN(A:A))/B1,1)))-1)*B1+MIN(A:A))}

唯一的問題是,我需要選擇 N個單元,並應用這個公式得到N個頻點用作數據源我的條形圖。可以跳過這一步嗎?例如。是否有可能在單個單元格中使用此公式 - 稍加修改 - 以便在用作數據源時,它被解釋爲N個單元格,從而生成一個具有N個值的良好直方圖?

謝謝。

Here's the answer that led me to the formula above.

回答

6

(這是方法的宏觀驅動的動態範圍調整大小事情相當不同的,所以我使用一個單獨的答案...)

動態柱狀圖可以通過記住建成「命名範圍」實際上命名爲公式,因此它們的值可能是動態的,在某些情況下非常重要。

讓我們從假定我們在第1行開始的A列中有一組任意值,並且我們還有另一個單元格,它包含我們在直方圖中想要的單元數。在我的工作手冊中,碰巧是E2。因此,我們火了名稱管理器(以下簡稱「公式」選項卡上),並創建

num_bins    =Sheet1!$E$2 

我已經定義多個容器,而不是塊大小(我們將在後面定義),因爲後者使我們很難確切知道如何設置我們的邊界邊界:我們對第一個和最後一個邊框可能覆蓋值範圍的不同大小部分的想法感到滿意,例如?*

我們也可以設置建立動態公式來描述我們的數據:

data_count   =COUNT(Sheet1!$A:$A) 
data_vals   =OFFSET(Sheet1!$A$1,0,0,data_count,1) 
max_val    =MAX(data_vals) 
min_val    =MIN(data_vals) 

通過這些定義,我們可以變得花哨。每個垃圾桶應該多大?讓另一個叫公式:

bin_size    =(max_val-min_val)/(num_bins) 

這裏來的科學:這些公式使動態數組:

bin_array   =min_val+ROW(OFFSET(Sheet1!$A$1,0,0,num_bins-1,1))*bin_size 
bin_labels   =min_val+ROW(OFFSET(Sheet1!$A$1,0,0,num_bins,1))*bin_size   
data_vals   =FREQUENCY(data_vals,bin_array) 

第一個是棘手:它採用的是num_bins minus one -size範圍的行號生成bin_size的倍數。它不會在min_val處啓動陣列,因爲FREQUENCY()函數會計數達到每個bin值的項目。它比想要的單元數小,因爲該函數產生一個更大的數組,其中最後的條目具有高於的點數最高的單元數。所以我們爲演示目的製作一個單獨的bin_labels數組。

現在我們可以製作一個圖表。插入(比如說)二維柱形圖並打開「選擇數據」對話框(可以從功能區或右鍵單擊圖表)。添加一個新系列,將系列值設置爲=Sheet1!freq_array。有必要包含工作表名稱或工作簿名稱以使其發揮作用。如果您喜歡,請添加系列名稱,然後單擊「確定」。現在單擊「編輯」爲「水平(類別)軸標籤」,並將範圍設置爲=Sheet1!bin_labels

這裏的2000個細胞=RAND()*5和5箱(我列出的名字和他們的公式,用值,其中不產生陣列)

2000 <code>=RAND()*5</code> results into 5 bins

和不斷變化的num_bins到10後的同一張紙上。 (該式RAND()重新計算,所以箱加起來可能完全相同的值)

After changing num_bins to 10

  • (如果你必須有一個用戶定義的窗口尺寸,你需要做bin_size紙張基準,並與一個名叫公式計算num_bins
+0

現在,這是一個很好的答案。謝謝! :) – l33t 2012-03-07 15:41:51

+1

雖然小修正:第二個'data_vals'應該重命名,以避免名稱衝突。 – l33t 2012-03-07 15:53:50

0

我能想到的唯一的答案是使用宏來調整您的公式的輸出範圍。

下面是一個簡單的片段,說明了這個想法。

Dim result As Variant 
Dim targetCols As Long 

result = Evaluate(fmla) 
With rng 
    targetCols = UBound(result, 1) - LBound(result, 1) + 1 
    .Resize(1, targetCols).FormulaArray = fmla 
End With 

我寫了一篇關於a more complete implementation去年 - 更多的容錯,二維輸出等

編輯:但是......你使用不使用這種方法工作的公式:它依賴於輸入範圍的輸出範圍。這裏有一個替代的建議,可以自動調整大小:

我們可以建立一套可行的箱像這樣的東西:

={(ROW(OFFSET(A1,0,0,CEILING((MAX(A:A)-MIN(A:A))/B1,1)+1,1))-1)*B1} 

哪裏像以前一樣,這是倉數目

CEILING((MAX(A:A)-MIN(A:A))/B1,1)+1 

然後我們使用OFFSET()來創建一個範圍(由於我們沒有使用它的值,因此目標無關緊要)。然後我們將範圍內的每個單元格的ROW()(減去1得到一組以零開始的值)並乘以我們的bin大小。您可能想要改變值的範圍(例如,通過添加MIN(A:A))。

最大的區別在於,此公式不需要輸入範圍內的VBA函數以生成範圍輸出。

要獲得直方圖,可以將bin公式的輸出插入FREQUENCY(),或者將其放入整個公式中。自動調整大小應該以任何方式工作。

如果您特別反對運行宏(我通過自定義功能區按鈕和熱鍵組合可以使用它),那麼您可以使用Worksheet_Change事件來觀察應用它的機會。我不能肯定地說這是否會有不愉快的副作用。

+0

我想創建一個動態直方圖,可以很容易地通過改變單個常量(bin大小)來改變。我甚至可能禁用UI交互(我使用Excel自動創建直方圖)。 – l33t 2012-03-06 09:41:03

+0

「直方圖」是工作表上所需的輸出圖表還是數組?如果是圖表,整個事情可以用命名公式完成。否則,你將需要一個範圍調整大小功能,或爲該範圍設置一個最大大小,並使你的數組​​很大。 – 2012-03-06 13:18:25

+0

只要圖表更新時更改了容器大小,圖表就沒有問題。我嘗試過使用命名公式,但不斷收到錯誤...之前從未做過這件事:P – l33t 2012-03-06 13:56:36