说我的数据如下:
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个单位的红色。
感谢您的帮助!
答案 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:
答案 1 :(得分:3)
您可以使用unique
和histc
函数执行所需操作,以获取唯一值和频率计数,然后使用bar
中的'stacked'
选项绘制数据。请注意,在下文中,我将level
和age
作为列向量。我还将代码的核心部分设为通用,而不是针对此特定示例。
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')