Marqueurs semi-transparents dans Matlab Figures
-
28-10-2019 - |
Question
Je souhaite tracer un nuage de points avec des marqueurs pleins et les rendre semi-transparents afin que, lorsque deux ou plusieurs marqueurs se chevauchent, la zone de chevauchement soit plus opaque.
J'ai pensé naïvement
sg = scatter(rand(1000,1),rand(1000,1), 'filled');
alpha(0.5)
fonctionnerait, mais ce n'est pas le cas.
set(get(sg, 'Children'), 'FaceAlpha', 0.2)
ne fonctionne pas.Des idées?
La solution
AFAIK, vous ne pouvez pas changer les valeurs alpha des marqueurs de tracé dans scatter
.Une solution serait de patch
pour dessiner des marqueurs vous-même.Les valeurs alpha peuvent être définies pour les objets patch()
et vous obtiendrez l'effet souhaité lorsque les marqueurs se chevauchent.Cependant, cela peut devenir assez fastidieux et devra être personnalisé en fonction de vos besoins.
Voir cette question connexe , où la fonction définie dans lequestion fait exactement cela.Vous pouvez vous en servir comme point de départ et travailler à partir de là.
Autres conseils
Voici un exemple de code matlab qui crée des points de nuage de points transparents avec des objets patch:
x=randn(5000,1)*20;
y= randn(5000,1)*20;
t= 0:pi/10:2*pi;
figure();
for i=1:size(x)
pb=patch((sin(t)+ x(i)),(cos(t)+y(i)),'b','edgecolor','none');
alpha(pb,.1);
end
Vous pouvez réellement y arriver sans utiliser de patch.L'exemple ci-dessous utilise le MarkerHandle masqué pour vous permettre d'accéder à la transparence.Tout ce que vous avez à fournir est le code RVB de la couleur souhaitée et le niveau de transparence sur la même échelle.L'exemple ci-dessous trace les marqueurs aléatoires dans un rouge transparent avec une opacité de 10% en définissant FaceColorData
sur uint8(255*[1;0;0;0.1])
sg = scatter(rand(1000,1),rand(1000,1), 'filled');
sMarkers=sg.MarkerHandle; %hidden marker handle
sMarkers.FaceColorData = uint8(255*[1;0;0;0.1]); %fourth element allows setting alpha
sMarkers.EdgeColorData = uint8(255*[1;0;0;0]); %set edge color in a similar way
Basé sur http://undocumentedmatlab.com/blog/plot-marqueurs-transparence-et-dégradé de couleurs
Voici une fonction que j'ai utilisée pour créer un scatter semi-transparent.
* Ceci est une version modifiée de la réponse user2149589 (un peu plus compatible avec les matlab).
function scatterPoints = transparentScatter(x,y,sizeOfCirlce,opacity)
% usage example:
% scatterPoints = transparentScatter(randn(5000,1),randn(5000,1),0.1,0.05);
% set(scatterPoints,'FaceColor',[1,0,0]);
defaultColors = get(0,'DefaultAxesColorOrder');
assert(size(x,2) == 1 && size(y,2) == 1 , 'x and y should be column vectors');
t= 0:pi/10:2*pi;
rep_x = repmat(x',[size(t,2),1]);
rep_y = repmat(y',[size(t,2),1]);
rep_t = repmat(t',[ 1, size(x,1)]);
scatterPoints = patch((sizeOfCirlce*sin(rep_t)+ rep_x),(sizeOfCirlce*cos(rep_t)+rep_y),defaultColors(1,:),'edgecolor','none');
alpha(scatterPoints,opacity);
end
Je ne suis pas sûr des versions précédentes, mais Matlab 2016 semble avoir la fonctionnalité que vous recherchez:
sg= scatter (rand (1000,1), rand (1000,1), 'rempli');
sg.MarkerFaceAlpha= 0.1;
Le code ci-dessus est une jolie petite fonction (pour ceux d'entre nous encore avant 2014b), mais peut être amélioré avec un appel à 'DataAspectRatio' et un ajustement de la taille du patch pour s'assurer que les cercles ressemblent à des cercles:
function scatterPoints = transparentScatter(x,y,sizeOfCirlce,opacity)
% usage example:
% scatterPoints = transparentScatter(randn(5000,1),randn(5000,1),0.1,0.05);
% set(scatterPoints,'FaceColor',[1,0,0]);
dRatio = get(gca,'DataAspectRatio');
dRatio = dRatio(1) / dRatio(2);
defaultColors = get(0,'DefaultAxesColorOrder');
assert(size(x,2) == 1 && size(y,2) == 1 , 'x and y should be column vectors');
t= 0:pi/10:2*pi;
rep_x = repmat(x',[size(t,2),1]);
rep_y = repmat(y',[size(t,2),1]);
rep_t = repmat(t',[ 1, size(x,1)]);
scatterPoints = patch((dRatio*sizeOfCirlce*sin(rep_t)+ rep_x),(sizeOfCirlce*cos(rep_t)+rep_y),defaultColors(1,:),'edgecolor','none');
alpha(scatterPoints,opacity);
end