2011-06-20 34 views
6

Decir que tengo los datos de la siguiente manera:Gráfica de barras apiladas Matlab

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

Busco para formar un gráfico de barras apiladas en Matlab, donde "nivel" está en el eje x y el número de ocurrencias de ese nivel (la frecuencia) está en el eje y: así 8 tendría un valor y de 3 y 9 tendría un valor y de 4. Además, estoy buscando tener esto como un gráfico de barras apiladas para que el nivel 8 lo haría tiene 1 unidad de color verde (verde tiene 10 años) y 2 unidades de color rojo (donde el rojo tiene 11 años) y 9 tendría 1 unidad de color verde y 3 unidades de color rojo.

¡Gracias por cualquier ayuda!

Respuesta

5

Usted puede hacer esto de una manera bastante compacta y general mediante la función ACCUMARRAY como tal, donde data es su matriz de 7 x 2 muestra de datos:

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 

Tenga en cuenta que la matriz de celdas de colores {'g';'r'} pasada a la función SET en la penúltima línea debe tener el mismo número de elementos que ageValues para funcionar correctamente .

Y aquí está el resultado bar graph:

enter image description here

+3

+1 buen uso de accumArray. Haría que el código fuera más general al no codificar los valores '[10 11]' en la llamada HISTC, sino que usaría 'uniqAge = unique (data (:, 2));'. También la leyenda es algo necesaria aquí: 'leyenda (strtrim (cellstr (num2str (uniqAge, 'Edad% d'))), 'Ubicación', 'NorthWest')' – Amro

+0

@Amro: Buenas sugerencias. He actualizado el código en consecuencia. – gnovice

3

Usted puede hacer lo que desee con los unique y histc funciones para obtener los valores únicos y conteos de frecuencia y luego utilizar la opción 'stacked' en bar para representar los datos. Tenga en cuenta que a continuación, tomé level y age como vectores de columna. También hice general las partes centrales del código en lugar de este ejemplo específico.

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

Cuestiones relacionadas