Setting overlap colours in plot with transparent layers

45 vues (au cours des 30 derniers jours)
z8080
z8080 le 15 Août 2022
Commenté : z8080 le 17 Août 2022
I have a plot with 3 filled surfaces, generated by commands such as
band(i_condition) = fill(xconf,yconf_CI95, colours(i_condition, :), 'FaceAlpha',alpha, 'LineStyle','-');
where
colours = [
213,94,0; % M
86,180,233; % L
166,166,166; % M&L
] / 255;
A legend is added using
conditions = {'M', 'L', 'M&L'};
[lh,icons] = legend(band, conditions, 'FontSize',23, 'units','normalized', 'Location', 'Best');
PatchInLegend = findobj(icons, 'type', 'patch');
set(PatchInLegend, 'facea', alpha)
The result looks like this
As can be seen, the parts of the bands that overlap are coloured rather ambiguously, and it's hard to tell them apart from the 3 conditions whose colours are specified. I assume the combinations of colours for the overlaps are computed automatically by Matlab, but is there a way to override those, or in some other way control them, so that the overlap areas end up being more distinctively coloured?
Also, is there a way for those overlap colours to themselves feature in the legend, so that it's 100% clear for the reader?
Thanks for any help!

Réponse acceptée

DGM
DGM le 16 Août 2022
Modifié(e) : DGM le 16 Août 2022
When using alpha properties to visualize the intersection of graphics objects, there isn't really a way to make the intersection color independent of the contributing colors. The intersection is simply a weighted mean of the two colors.
You might be able to do something like this example, but adjusting your workflow from using fill() to building point lists for using patch() might be a bit of a hoop to jump through.
Alternatively, if you use fill(), you might be able to get better visual contrast by starting with more visually-distinct colors to begin with. Regardless of the selected colors, you could construct the legend for the overlap area without explicitly needing to:
x = [1 3 4 3 1 0];
y = [0 0 2 4 4 2];
color = [1 0 0; 0 1 0; 0 0 1];
alpha = [0.3; 0.3; 0.3];
hold on
fh(1) = fill(x,y,color(1,:),'FaceAlpha',alpha(1));
fh(2) = fill(x+2,y,color(2,:),'FaceAlpha',alpha(2));
fh(3) = fill(x+1,y+2,color(3,:),'FaceAlpha',alpha(3));
fh = fliplr(fh);
% create legend entries for intersection regions without actually generating the intersection poly directly
color12 = (color(1,:)*alpha(1) + (1-alpha(1)))*(1-alpha(2)) + color(2,:)*alpha(2);
color23 = (color(2,:)*alpha(2) + (1-alpha(2)))*(1-alpha(3)) + color(3,:)*alpha(3);
color31 = (color(3,:)*alpha(3) + (1-alpha(3)))*(1-alpha(1)) + color(1,:)*alpha(1);
color123 = ((color(1,:)*alpha(1) + (1-alpha(1)))*(1-alpha(2)) + color(2,:)*alpha(2))*(1-alpha(3)) + color(3,:)*alpha(3);
pint12 = patch('xdata',x(1)*[1 1 1],'ydata',y(2)*[1 1 1],'FaceColor',color12); % dummy objects
pint23 = patch('xdata',x(1)*[1 1 1],'ydata',y(2)*[1 1 1],'FaceColor',color23);
pint31 = patch('xdata',x(1)*[1 1 1],'ydata',y(2)*[1 1 1],'FaceColor',color31);
pint123 = patch('xdata',x(1)*[1 1 1],'ydata',y(2)*[1 1 1],'FaceColor',color123);
% set up legend
legend([fh pint12 pint23 pint31 pint123],'p1','p2','p3','p1 ∩ p2','p2 ∩ p3','p3 ∩ p1','p1 ∩ p2 ∩ p3');
  1 commentaire
z8080
z8080 le 17 Août 2022
Excellent, thanks so much for this very helpful answer.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Lighting, Transparency, and Shading dans Help Center et File Exchange

Produits


Version

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by