Help organizing legend for bar graph

3 次查看(过去 30 天)
Kitt
Kitt 2024-10-21,17:05
评论: Voss 2024-10-21,17:47
So I had a very helpful response in a previous question for creating a legend organizing some data and I've tried manipulating it for another graph but I'm having issues making it work when there are a few more bars
So here's the code for the 1st graph
NN = size(patch,1);
t = 1:NN;
figure
hold on
% Shading based on 'env' value
colors = [ ...
0.898 1 0.337 ; ...
0.561 1 0.643 ; ...
0.561, 0.969, 1 ; ...
0.902 0.561 1 ; ...
];
NC = 4;
hreg = cell(1,NC);
emptyhreg = false(1,NC);
for ii = 1:NC
if ~any(env == ii)
emptyhreg(ii) = true;
continue
end
hreg{ii} = xregion(t(env==ii)+0.5*[-1;1],'FaceColor',colors(ii,:),'FaceAlpha',1);
end
% Count choices for patch 1 and patch 2, ignoring NaN values
count_patch1 = sum(patch == 1, 2);
count_patch2 = sum(patch == 2, 2);
hbar = bar(t,[count_patch1, count_patch2],'EdgeColor','none');
hbar(1).FaceColor = 'r';
hbar(2).FaceColor = 'b';
xlim('tight')
xticks(t)
xlabel('timestep')
ylabel('# of individuals')
h = cellfun(@(x)x(1),hreg(~emptyhreg));
s = ["high","low"];
idx = dec2bin(circshift(NC-1:-1:0,2),2)-'0'+1;
str = join("patch "+[1 2]+" "+s(idx),"/");
str = str(~emptyhreg);
h = [h hbar];
str = [str; "went to patch "+[1;2]];
legend(h,str,'Location','NorthOutside')
Now I want to do something similar with a bar graph that has 4 bars. I tried just changing the second portion of the str to include those two extra bars
hbar = bar(countp,'EdgeColor','none');
hbar(1).FaceColor = 'r';
hbar(2).FaceColor = 'b';
hbar(3).FaceColor = 'k';
hbar(4).FaceColor = 'w';
s = ["high","low"];
idx = dec2bin(circshift(NC-1:-1:0,2),2)-'0'+1;
str = join("patch "+[1 2]+" "+s(idx),"/");
str = str(~emptyhreg);
h = [h hbar];
str = [str;"went to patch 1 and found food","went to patch 1 and didn't","went to patch 2 and found food","went to patch 2 and didn't"];
legend(h,str,'Location','NorthOutside')
But I got this error
Error using vertcat
Dimensions of arrays being concatenated are not consistent.
Error in forwardsim_socialinfo2 (line 1019)
str = [str; "went to patch 1 and found food","went to patch 1 and didn't","went to patch 2 and found food","went to patch 2 and didn't"];
How do I add in these extra bar labels?
Hopefully this is enough, but let me know if more context/code is needed.

采纳的回答

Voss
Voss 2024-10-21,17:28
str is a column vector, so use semicolons (instead of commas) to append new elements
str = [str;"went to patch 1 and found food";"went to patch 1 and didn't";"went to patch 2 and found food";"went to patch 2 and didn't"];
% ^ ^ ^
A similar example to illustrate the problem, using a numeric vector:
x = [1; 2; 3] % a column vector
x = 3×1
1 2 3
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
x = [x; 4; 5] % append a 4 and a 5 to x
x = 5×1
1 2 3 4 5
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
x = [x; 4, 5] % error
Error using vertcat
Dimensions of arrays being concatenated are not consistent.
If that doesn't work or there are other problems, please share enough code and variables that we can run it (e.g., countp is not defined in the code we can see).

更多回答(0 个)

Community Treasure Hunt

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

Start Hunting!

Translated by