overlay bar plot without mixing color

10 vues (au cours des 30 derniers jours)
piepsi
piepsi le 8 Nov 2021
Commenté : piepsi le 8 Nov 2021
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

Rik
Rik le 8 Nov 2021
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
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?
piepsi
piepsi le 8 Nov 2021
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 Help Center 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