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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top