2011-06-20 18 views
6

Say mam dane w następujący sposób:Skumulowany słupkowy Matlab

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

szukam, aby utworzyć skumulowany wykres słupkowy w programie MATLAB, gdzie „poziom” jest na osi x oraz liczby wystąpień tego poziomu (częstotliwość) jest na osi Y: więc 8 miałoby wartość y równą 3, a 9 miało wartość y równą 4. Ponadto szukam tego jako skumulowanego wykresu słupkowego, więc poziom 8 mają 1 jednostkę w kolorze zielonym (zielony to 10 lat) i 2 jednostki w kolorze czerwonym (gdzie czerwony to wiek 11), a 9 ma 1 jednostkę w kolorze zielonym i 3 jednostki w kolorze czerwonym.

Dzięki za pomoc!

Odpowiedz

5

Można to zrobić w dość zwarty i ogólny sposób korzystania z funkcji ACCUMARRAY jak tak, to gdzie data to 7-by-2 matryca próbki danych:

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 

Należy zauważyć, że tablica komórek kolorów {'g';'r'} przekazywana do funkcji SET w linii od drugiej do ostatniej powinna mieć taką samą liczbę elementów, jak ageValues do prawidłowego działania .

A oto powstały bar graph:

enter image description here

+3

+1 ładny wykorzystanie ACCUMARRAY. Uczyniłbym ten kod bardziej ogólnym, nie zakodowawszy na sztywno wartości "[10 11]" w wywołaniu HISTC, zamiast tego używając 'uniqAge = unique (data (:, 2));'. Również legenda jest nieco potrzebna tutaj: 'legend (strtrim (cellstr (num2str (uniqAge, 'Age% d'))), 'Location', 'NorthWest')' – Amro

+0

@Amro: Dobre sugestie. Zaktualizowałem kod odpowiednio. – gnovice

3

Możesz robić co chcesz za pomocą funkcji unique i histc aby uzyskać unikalne wartości i liczby częstotliwości, a następnie wybierz opcję 'stacked' w bar wykreślić dane. Zauważ, że poniżej podjąłem level i age jako wektory kolumn. Zrobiłem również centralne części kodu ogólnego zamiast tego konkretnego przykładu.

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