overlay bar plot without mixing color

I would like to create a bar plot with overlaying bars of different colours.
I tried using FaceAlpha but this alters the colours.
Basically, I would like my plot to look like a stacked bar colour wise, but like an ovelayed bar in terms of the values.
This is the simplified code and result of what I have tried:
A = [1;5;3;7;4];
B = [3;2;4;8;2];
figure;
bar(A, 'FaceColor', 'b', 'FaceAlpha',0.5)
hold on
bar(B, 'FaceColor', 'y', 'FaceAlpha',0.5)
hold off
How can I overlay my bars in a way that they show the colour I defined instead of mixing them to this weird muddy green in the overlaying bits?

 Réponse acceptée

Here is my solution, which allows you to specify the 3 face colors separately:
A = [1;5;3;7;4];
B = [3;2;4;8;2];
shared=min(A,B);
A_high=max(0,A-shared);
B_high=max(0,B-shared);
data=[shared A_high B_high];
h=bar(data,'stacked');
h(1).FaceColor='g';
h(2).FaceColor='b';
h(3).FaceColor='y';

3 commentaires

piepsi
piepsi le 8 Nov 2021
Thank you for your reply! This is not quite what I am looking for though. Rather than adding a third colour for the overlapping bits, I would just like the values in A to be blue and those in B to be yellow. So at x axis =1 the green should be blue, at x=2 it should be yellow and so on
Rik
Rik le 8 Nov 2021
I think need to add another column in data to do that. The idea would be the same in principle, but you would set one column to 0 if A is larger than B and the other to 0 if B is larger than A.
Why don't you have a try first?
And what should happen if A has the same value as B?
I figured it out! Thank you for your help.
Here's the code for anyone having a similar problem:
A = [1;5;3;7;4];
B = [3;2;4;8;2];
shared = min(A,B);
A_high = max(0,A-shared);
B_high = max(0,B-shared);
A_low_idx = find(A<B);
B_low_idx = find(A>B);
A_idx_low = [A_low_idx(:); B_low_idx(:)];
B_idx_low = [B_low_idx(:); A_low_idx(:)];
zero = zeros(numel(A));
A_low = [A(A_low_idx); zero(B_low_idx)];
B_low = [B(B_low_idx); zero(A_low_idx)];
[A_idx_low, A_ids_low] = sort(A_idx_low);
[B_idx_low, B_ids_low] = sort(B_idx_low);
A_low = A_low(A_ids_low);
B_low = B_low(B_ids_low);
data = [A_low B_low A_high B_high];
h = bar(data,'stacked');
h(1).FaceColor = 'b';
h(2).FaceColor = 'y';
h(3).FaceColor = 'b';
h(4).FaceColor = 'y';

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Networks dans Centre d'aide et File Exchange

Produits

Version

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by