2014-11-24 83 views
0

我有一個646x108陣列的646個學生對108個考題的回答。這是一個MCQ考試,所有答案都是A,B,C或D,所以這些字母是單元格數組的內容。我已經指示創建一個類似於下面的一個圖:如何生成分類響應的MATLAB條形圖?

enter image description here

我被告知,「酒吧」功能會工作。但是,它不適用於單元陣列。

我試着將它改爲double的數組,其中A被轉換爲1,B轉換爲2,C轉換爲3,D轉換爲4.但是,這仍然不起作用。這似乎不是將回答視爲明確,而是將回答平均化。

當我在單元格的格式我工作,該數據是這樣的:

enter image description here

換句話說,在Q1的人1回答了,和人2回答B.在Q2既生回答D.

當我轉換該雙重中,A成爲1時,B 2,依此類推。

+1

這將有助於如果你能提供一個什麼樣的數據看起來,它是如何構成的一個樣本。 – David 2014-11-24 02:09:03

回答

2

試試這個。首先,我創建了一些樣本數據,對10名學生回答5個問題:

choices=['A' 'B' 'C' 'D'] %// I'll use this variable later as well 
for m=1:10 
    for n=1:5 
     answers{m,n}=choices(randi(4)); 
    end 
end 
answers 

然後找到每個回答每一個問題,freq的頻率,我看着每個響應獨立,並計算了多少學生給那回答這個問題。這給了freq,一個數組有4行(每個可能的答案一個)和5列(每個問題一個)。

freq=zeros(length(choices),size(answers,2)); 
for i=1:length(choices) 
    freq(i,:)=sum(strcmp(answers,choices(i))); 
end 

然後做柱狀圖中,你必須採取的freq轉置,和我的學生數除以它,這樣的酒吧有高度1.

bar(freq.'/size(answers,1),'stack') 
legend('A','B','C','D','Location','NorthEastOutside') 

enter image description here

作爲邊注,freq也可以在沒有一個for迴路計算

freq=cell2mat(arrayfun(@(k) sum(strcmp(answers,choices(k))),1:length(choices),'UniformOutput',false).') 

但它不是很可讀或高效。