6

假设我有如下数据:

 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 个红色单位。

谢谢你的帮助!

4

2 回答 2

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'}传递给函数SETageValues的颜色元胞数组应该具有与正常运行相同数量的元素。

这是生成的条形图

在此处输入图像描述

于 2011-06-20T04:14:38.037 回答
3

unique您可以使用和函数执行您想要的操作histc来获取唯一值和频率计数,然后使用'stacked'选项 inbar绘制数据。请注意,在下文中,我采用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')

在此处输入图像描述

于 2011-06-20T03:52:42.140 回答