2011-06-20 40 views
6

Nói rằng tôi có dữ liệu như sau:Stacked Bar Graph Matlab

level,age 
    8,10 
    8,11 
    8,11 
    9,10 
    9,11 
    9,11 
    9,11 

tôi đang tìm cách để tạo ra một biểu đồ hình cột xếp chồng lên nhau trong Matlab nơi "cấp độ" là trên trục x và số lần xuất hiện của mức đó (tần số) là trên trục y: vì vậy 8 sẽ có giá trị y là 3 và 9 sẽ có giá trị y là 4. Hơn nữa, tôi đang tìm kiếm điều này dưới dạng biểu đồ thanh xếp chồng để mức 8 sẽ có 1 đơn vị màu xanh lá cây (xanh lá cây là 10 tuổi) và 2 đơn vị có màu đỏ (màu đỏ là 11 tuổi) và 9 đơn vị sẽ có 1 đơn vị màu xanh lá cây và 3 đơn vị có màu đỏ.

Cảm ơn bạn đã trợ giúp!

Trả lời

5

Bạn có thể làm điều này một cách khá nhỏ gọn và tổng quát bằng cách sử dụng chức năng ACCUMARRAY như vậy, nơi data là ma trận mẫu 7-by-2 dữ liệu của bạn:

ageValues = unique(data(:,2));   %# Vector of unique age values 
barData = accumarray(data(:,1),data(:,2),[],@(x) {hist(x,ageValues)}); 
X = find(~cellfun('isempty',barData)); %# Find x values for bars 
Y = vertcat(barData{:});    %# Matrix of y values for bars 
hBar = bar(X,Y,'stacked');    %# Create a stacked histogram 
set(hBar,{'FaceColor'},{'g';'r'});  %# Set bar colors 
legend(cellstr(num2str(ageValues)),'Location','NorthWest'); %# Add a legend 

Lưu ý rằng mảng ô màu của các màu {'g';'r'} được chuyển đến hàm SET trong dòng thứ hai đến cuối cùng phải có cùng số phần tử như ageValues để hoạt động đúng .

Và đây là kết quả bar graph:

enter image description here

+3

+1 thoải mái sử dụng các ACCUMARRAY. Tôi sẽ làm cho mã tổng quát hơn bằng cách không mã hóa cứng các giá trị '[10 11]' trong cuộc gọi HISTC, thay vì sử dụng 'uniqAge = unique (dữ liệu (:, 2));'. Ngoài ra truyền thuyết là phần nào cần thiết ở đây: 'legend (strtrim (cellstr (num2str (uniqAge, 'Age% d'))), 'Location', 'NorthWest')' – Amro

+0

@Amro: Các gợi ý hay. Tôi đã cập nhật mã cho phù hợp. – gnovice

3

Bạn có thể thực hiện những gì bạn muốn bằng cách sử dụng các chức năng uniquehistc để nhận giá trị và tần suất duy nhất và sau đó sử dụng tùy chọn 'stacked' trong bar để vẽ dữ liệu. Lưu ý rằng trong các trường hợp sau, tôi đã chụp levelage làm các vectơ cột. Tôi cũng đã thực hiện các phần trung tâm của mã chung thay vì cho ví dụ cụ thể này.

level=[8,8,8,9,9,9,9]';    %'#SO code formatting 
age=[10,11,11,10,11,11,11]';   %' 

%#get unique values and frequency count 
uniqLevel=unique(level); 
freqLevel=histc(level,uniqLevel);  
uniqAge=unique(age); 

%#combine data in a manner suitable for bar(...,'stacked') 
barMatrix=cell2mat(arrayfun(@(x)histc(age(level==uniqLevel(x)),uniqAge),... 
    1:numel(uniqLevel),'UniformOutput',false)); 

%#plot the stacked bars and customize 
hb=bar(barMatrix','stacked');  %' 

set(gca,'xticklabel',uniqLevel,'ytick',1:max(sum(barMatrix))) 
set(hb(uniqAge==10),'facecolor','green') 
set(hb(uniqAge==11),'facecolor','red') 

xlabel('Level') 
ylabel('Occurrence') 
legend('10','11','location','northwest') 

enter image description here