6

次のようなデータがあるとします。

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

「レベル」が x 軸にあり、そのレベル (頻度) の発生数が y 軸にある、Matlab で積み上げ棒グラフを作成しようとしています。したがって、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

最後から 2 番目の行で関数SET{'g';'r'}に渡される色のセル配列は、適切に機能するのと同じ数の要素を持つ必要があることに注意してください。ageValues

結果の棒グラフは次のとおりです。

ここに画像の説明を入力

于 2011-06-20T04:14:38.037 に答える
3

uniqueおよび関数を使用してhistc、一意の値と度数を取得し、'stacked'オプション inを使用しbarてデータをプロットすることができます。以下では、 とを列ベクトル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')

ここに画像の説明を入力

于 2011-06-20T03:52:42.140 に答える