Сложенная гистограмма Matlab - PullRequest
6 голосов
/ 20 июня 2011

Скажите, у меня есть следующие данные:

 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 ]

5 голосов
/ 20 июня 2011

Вы можете сделать это довольно компактным и общим способом, используя функцию 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, для правильной работы.

А вот итоговая гистограмма :

enter image description here

3 голосов
/ 20 июня 2011

Вы можете делать что хотите, используя функции unique и histc, чтобы получить уникальные значения и счетчики частоты, а затем использовать параметр 'stacked' в 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')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...