2011-06-20 225 views
6

说我有数据如下:堆积条形图Matlab的

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

我期待以形成在Matlab堆叠条形图其中,“水平”是在该电平的occurances的x轴和数目(频率)在y轴上:所以8的y值为3,9的y值为4.此外,我希望将此作为堆叠条形图,因此8级会有1个单位为绿色(绿色为10岁),2个单位为红色(红色为11岁),9个单位为绿色,3个单位为红色。

感谢您的帮助!

回答

5

你可以在一个相当紧凑和通用的方式使用功能ACCUMARRAY像这样,在data是数据的7×2样品基质做到这一点:

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 

请注意,颜色为{'g';'r'}的单元阵列在倒数第二行中传递给功能SET的单元阵列数应与ageValues的功能单元数相同。

而这里的产生bar graph

enter image description here

+3

+1不错的使用ACCUMARRAY的。我通过在HISTC调用中不对硬编码值[10 11]进行硬编码,而是使用'uniqAge = unique(data(:,2));'来使代码更一般化。此外,这里还需要传说:'legend(strtrim(cellstr(num2str(uniqAge,'Age%d'))),'Location','NorthWest')' – Amro

+0

@Amro:好的建议。我已经相应地更新了代码。 – gnovice

3

您可以使用uniquehistc函数来获取唯一值和频率计数,然后使用bar中的'stacked'选项绘制数据。请注意,在下面,我已将levelage作为列向量。我还将代码的核心部分作为一般而不是这个特定的例子。

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