Changing color in legend for grouped bar graph and Minimizing Concise Code

조회 수: 1 (최근 30일)
Meghna Raj
Meghna Raj 2024년 8월 2일
댓글: dpb 2024년 8월 2일
Currently I have a legend for my bar graph that shows the colors of the Achilles tendon. But I want the legend to show a dark color (black) for Rupture, gray for Tendinopathy, and Light gray for Healthy. How would I do that in MATLAB? Also, if you look at my code you will notice that it is very repetitive since I am editing each bar. I would greatly appreciate any advice on how to minimize this code, maybe by using a for loop?
groups = categorical({'Achilles','LG','MG','Soleus'});
hold on
figure(1)
CSA_graph = bar(groups, avgCSA)
title('Average CSA for Triceps Surae and Achilles Tendon')
xlabel("Tissue Name")
ylabel('Average CSA (mm^2)')
legend('Achilles Rupture','Achilles Tendinopathy','Healthy',Location='west')
for a=1:3
CSA_graph(a).FaceColor = 'flat';
end
CSA_graph(1).CData(1,:) = [hex2rgb('#556EC1')];
CSA_graph(2).CData(1,:) = [hex2rgb('#648FFF')];
CSA_graph(3).CData(1,:) = [hex2rgb('#9AB6FF')];
CSA_graph(1).CData(2,:) = [hex2rgb('#98295D')];
CSA_graph(2).CData(2,:) = [hex2rgb('#DC267F')];
CSA_graph(3).CData(2,:) = [hex2rgb('#EC87B9')];
CSA_graph(1).CData(3,:) = [hex2rgb('#B9521A')];
CSA_graph(2).CData(3,:) = [hex2rgb('#FE6100')];
CSA_graph(3).CData(3,:) = [hex2rgb('#FE9858')];
CSA_graph(1).CData(4,:) = [hex2rgb('#337E21')];
CSA_graph(2).CData(4,:) = [hex2rgb('#1CC214')];
CSA_graph(3).CData(4,:) = [hex2rgb('#82D97E')];
hold off
  댓글 수: 1
dpb
dpb 2024년 8월 2일
@Meghna Raj, it would be helpful if you would attach the data; just "save avgCSA avgCSA" and then attach the .mat file..are the other colors what you want; only changing those for the first set? If so, simply find a color triplet you like and replace the current values with those. Solid black is [0 0 0]; a common light gray is 0.9*[1 1 1]; adjust to whatever level of darkness suits.
You could write the above in a for loop, yes, but you would have to then store the color data in an array by group and condition and index into that array; once you've got the above written unless there are going to be alternate numbers of groups and/or conditions per group, it would hardly seem worth the effort; once you package this in a function that gets called, it's "out of sight, out of mind" and doesn't need anything but to pass it the data array...

댓글을 달려면 로그인하십시오.

답변 (1개)

dpb
dpb 2024년 8월 2일
이동: dpb 2024년 8월 2일
MAX=[200, 900, 1200, 2000]; % a max to generate sample data
MIN=[ 50, 600, 900, 1800]; % and a min
for i=1:numel(MAX)
avgCSA(i,:)=randi([MIN(i) MAX(i)],1,3);
end
groups = categorical({'Achilles','LG','MG','Soleus'});
hold on
figure(1)
CSA_graph = bar(groups, avgCSA);
title('Average CSA for Triceps Surae and Achilles Tendon')
xlabel("Tissue Name")
ylabel('Average CSA (mm^2)')
legend('Achilles Rupture','Achilles Tendinopathy','Healthy',Location='northwest')
%for a=1:3
% CSA_graph(a).FaceColor = 'flat';
%end
set(CSA_graph,{'FaceColor'},{'flat'}); % can use multiple-handle facility of set
SHADES=[0 0.5 0.9]; % define some shades of gray...
CSA_graph(1).CData(1,:) = SHADES(1)*[1 1 1];
CSA_graph(2).CData(1,:) = SHADES(2)*[1 1 1];
CSA_graph(3).CData(1,:) = SHADES(3)*[1 1 1];
CSA_graph(1).CData(2,:) = [hex2rgb('#98295D')];
CSA_graph(2).CData(2,:) = [hex2rgb('#DC267F')];
CSA_graph(3).CData(2,:) = [hex2rgb('#EC87B9')];
CSA_graph(1).CData(3,:) = [hex2rgb('#B9521A')];
CSA_graph(2).CData(3,:) = [hex2rgb('#FE6100')];
CSA_graph(3).CData(3,:) = [hex2rgb('#FE9858')];
CSA_graph(1).CData(4,:) = [hex2rgb('#337E21')];
CSA_graph(2).CData(4,:) = [hex2rgb('#1CC214')];
CSA_graph(3).CData(4,:) = [hex2rgb('#82D97E')];
hold off
  댓글 수: 1
dpb
dpb 2024년 8월 2일
As for adding looping for the rest, it just seemed more effort than results gained...

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Environment and Settings에 대해 자세히 알아보기

제품


릴리스

R2024a

Community Treasure Hunt

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

Start Hunting!

Translated by