Borrar filtros
Borrar filtros

Plotting a Graph From a Cell Array

10 visualizaciones (últimos 30 días)
MarshallSc
MarshallSc el 28 de En. de 2022
Comentada: MarshallSc el 29 de En. de 2022
I have a cell array, let's call it A, which is a 4 x 4 cell each containing a 10 x 10 numbers from 1 to 5 (the cell array attached):
A = cell(4,4);
Each cell array is like:
I want to plot a graph for each cell (for just one) and all of the cells (for all 16 cell arrays) in separate code that shows how many of the components are 1, 2,3,4 and 5. Essentially a chart similar to (I don't think Matlab can graph such a chart, but something similar):
"A" here is just one of the frame indices (I have to plot multiple cell arrays). Thank you!

Respuesta aceptada

Voss
Voss el 28 de En. de 2022
Editada: Voss el 28 de En. de 2022
First, check out the data:
load('A.mat')
whos
Name Size Bytes Class Attributes Kappa_x_num 4x4 171264 cell ans 1x30 60 char
Kappa_x_num{1,1}
ans = 10×10 cell array
{'4'} {'4'} {'1'} {'3'} {'1'} {'1'} {'1'} {'1'} {'5'} {'5'} {'5'} {'1'} {'1'} {'3'} {'1'} {'1'} {'1'} {'5'} {'1'} {'1'} {'1'} {'1'} {'5'} {'3'} {'3'} {'1'} {'1'} {'1'} {'5'} {'1'} {'5'} {'5'} {'1'} {'1'} {'1'} {'1'} {'1'} {'1'} {'1'} {'5'} {'4'} {'5'} {'1'} {'4'} {'1'} {'1'} {'1'} {'1'} {'5'} {'1'} {'5'} {'1'} {'5'} {'3'} {'1'} {'1'} {'3'} {'1'} {'5'} {'1'} {'1'} {'1'} {'3'} {'3'} {'1'} {'1'} {'1'} {'5'} {'5'} {'5'} {'4'} {'1'} {'5'} {'3'} {'1'} {'1'} {'1'} {'1'} {'1'} {'5'} {'1'} {'1'} {'1'} {'1'} {'1'} {'1'} {'1'} {'1'} {'5'} {'5'} {'5'} {'1'} {'5'} {'1'} {'1'} {'1'} {'3'} {'1'} {'5'} {'1'}
Then, do some counting:
[m,n] = size(Kappa_x_num);
max_value = 5;
counts = zeros(m,n,max_value);
for ii = 1:m
for jj = 1:n
for kk = 1:max_value
counts(ii,jj,kk) = nnz(strcmp(Kappa_x_num{ii,jj},num2str(kk)));
end
end
end
disp(counts);
(:,:,1) = 61 74 71 71 100 71 71 100 100 6 100 100 100 100 100 100 (:,:,2) = 0 0 0 0 0 0 0 0 0 37 0 0 0 0 0 0 (:,:,3) = 10 1 3 2 0 1 1 0 0 0 0 0 0 0 0 0 (:,:,4) = 5 0 0 2 0 0 0 0 0 56 0 0 0 0 0 0 (:,:,5) = 24 25 26 25 0 28 28 0 0 1 0 0 0 0 0 0
Then, make a stacked bar graph (rearranging the counts to do so):
counts = reshape(counts,[m*n max_value]);
disp(counts);
61 0 10 5 24 100 0 0 0 0 100 0 0 0 0 100 0 0 0 0 74 0 1 0 25 71 0 1 0 28 6 37 0 56 1 100 0 0 0 0 71 0 3 0 26 71 0 1 0 28 100 0 0 0 0 100 0 0 0 0 71 0 2 2 25 100 0 0 0 0 100 0 0 0 0 100 0 0 0 0
figure()
bar(counts,'stacked');
ax = gca();
set(get(ax,'XAxis'), ...
'TickValues',1:m*n, ...
'TickLabel',arrayfun(@(x)sprintf('%d',x),1:m*n,'UniformOutput',false), ...
'TickLabelRotation',0);
set(get(ax,'XLabel'),'String','frame indices');
set(get(ax,'YLabel'),'String','% of points');
legend( ...
arrayfun(@(x)sprintf('''%d''',x),1:max_value,'UniformOutput',false), ...
'Location','EastOutside');
  7 comentarios
Voss
Voss el 29 de En. de 2022
Here's one way you can do it. Some of those files contain stuff that's not '1', '2', '3', '4', '5', so the count total is not 6400.
A = load('1249.mat');
B = load('1299.mat');
C = load('1349.mat');
D = load('1399.mat');
Kappa_x_num = cat(3,A.Kappa_x_num,B.Kappa_x_num,C.Kappa_x_num,D.Kappa_x_num);
[m,n,p] = size(Kappa_x_num);
max_value = 5;
counts = zeros(1,max_value);
for ii = 1:m
for jj = 1:n
for nn = 1:p
for kk = 1:max_value
counts(kk) = counts(kk) + nnz(strcmp(Kappa_x_num{ii,jj,nn},num2str(kk)));
end
end
end
end
disp(counts);
4931 99 655 103 157
figure()
bar([counts; NaN(1,max_value)],'stacked');
ax = gca();
set(get(ax,'YLabel'),'String','# of points');
set(ax,'XLim',[0.2 1.8]);
legend( ...
arrayfun(@(x)sprintf('''%d''',x),1:max_value,'UniformOutput',false), ...
'Location','EastOutside');
MarshallSc
MarshallSc el 29 de En. de 2022
Thanks a lot Ben, really appreciate you!

Iniciar sesión para comentar.

Más respuestas (0)

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by