堆积条形图Matlab

时间:2011-06-20 02:03:10

标签: matlab plot bar-chart stackedbarseries

说我的数据如下:

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

我正在寻找在Matlab中形成堆积条形图,其中“水平”在x轴上,并且该水平的出现次数(频率)在y轴上:所以8将具有y-值3和9的y值为4.此外,我希望将其作为堆积条形图,因此8级将具有1个单位的绿色(绿色是10岁)和2个单位的红色(其中红色是11岁),9将有1个单位的绿色和3个单位的红色。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

您可以使用函数ACCUMARRAY以相当紧凑和通用的方式执行此操作,其中data是您的7 x 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

请注意,传递给倒数第二行中的函数SET的颜色{'g';'r'}的单元格数组应具有与ageValues相同数量的元素才能正常运行。< / p>

这是结果bar graph

enter image description here

答案 1 :(得分: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