matlab: diagrammes de dispersion avec un nombre élevé de points de données

je suis en train de la parcelle de dispersion, quelque chose comme:

scatter(coor(:, 2), coor(:, 3), 1, coor(:, 4));

le problème est que j'ai un très grand nombre de coordonnées à tracer (~100 000). Cela prend beaucoup de temps pour le tracer, et quand j'essaie d'exporter chiffre à tiff - puis matlab est mort pour gooooood quelques minutes... Une solution pour améliorer le traçage, ou au moins l'exportation de tiff?

modifier: Oublié de mentionner, 3e coordonnée (coor(:, 4)) est un code couleur.

donc, quand j'utilise scatter (comme ci-dessus), j'ai quelque chose comme sur l'image ci-dessous, et c'est exactement comme ça que je veux la voir (juste son super slow et je ne peux pas l'exporter):

scatter

Quand je fais:

plot3 (coor (:, 2), coor (:, 3), coor (:, 4), '.')

l'effet n'est plus aussi cool (note: les images ne sont plus des mêmes coordonnées...):

enter image description here

17
demandé sur Art 2012-11-09 09:35:35

4 réponses

Vous pouvez utiliser complot, mais alors tous les points de la même couleur. Cependant, vous pouvez diviser l'ensemble dans différents sous-ensembles et les tracer chacun avec leur propre couleur:

N = 100000;
x = rand(N,1);
y = rand(N,1);
C = sin(2*x)+y;

cdivs = 10;
[~, edges] = hist(C,cdivs-1);
edges = [-Inf edges Inf]; % to include all points
[Nk, bink] = histc(C,edges);

figure;
hold on;
cmap = jet(cdivs);
for ii=1:cdivs
    idx = bink==ii;
    plot(x(idx),y(idx),'.','MarkerSize',4,'Color',cmap(ii,:));
end

colormap(cmap)
caxis([min(C) max(C)])
colorbar

enter image description here

qui répond déjà beaucoup mieux que scatter(x,y,1,C) qui donne à peu près le même tracé, mais avec une résolution de couleur plus élevée (qui est réglable dans mon code ci-dessus).

23
répondu Gunther Struyf 2012-11-09 11:23:05

mon expérience est que la commande de pointage la plus efficace dans matlab est Patch, et je l'ai utilisé pour émuler la fonctionnalité de scatter ou scatter3 avec beaucoup plus d'efficacité.

si vous avez une liste de points, Utilisez chaque point pour définir un patch carré (ou des octogones, ou autre) de longueur de bord raisonnable pour vos données particulières, puis tracez la collecte de patches avec un seul appel à patch. Après que l'objet graphique est créé, vous pouvez mettre à jour ses données de couleur de colorer individuellement les carrés.

Vous pouvez utiliser le même concept en 3D en construisant des cubes ou des croisements 3D à partir de votre ensemble de données.

cet extrait crée 1E5 carrés placés au hasard, avec des couleurs aléatoires dans ce cas et court dans un peu moins d'une seconde sur mon ordinateur portable de quatre ans. Un appel similaire à scatter prend 40 secondes, et renvoie un chiffre encombrant qui est difficile à manipuler.

tic
P=rand(1e5,2);
Edge=.01;
X=[P(:,1)'; P(:,1)'+Edge; P(:,1)'+Edge; P(:,1)'];
Y=[P(:,2)'; P(:,2)'; P(:,2)'+Edge; P(:,2)'+Edge];
figure;
h=patch(X,Y,'r');
set(h,'facevertexcdata',rand(size(X,2),3),'facecolor','flat','edgecolor','none')
drawnow
toc
1
répondu Jon Rankin 2013-07-16 23:24:38

Oui, utilisez plot3

plot3(coor(:, 2), coor(:, 3), coor(:, 4), '.')

cela fera la même chose qu'un scatter plot 3d (les points seront des petits points, vous pouvez aussi utiliser 'o' or 'x' si vous voulez)

0
répondu Fantastic Mr Fox 2012-11-09 05:42:19

Si vous avez trop de points, il pourrait être judicieux d'mince de données.

on pourrait faire deux approches:

  1. simple-il suffit de sélectionner-disons 10% des points au hasard.

  2. éliminez les points qui ne seraient pas visibles, évidemment ceux qui sont en dehors de votre portée, mais aussi si vous avez que plusieurs assez peu de chevauchement - disons un point devrait être 3px de diamètre - donc un point couvrirait dire 9px. Sur ma machine un complot comme vous posté serait-disons 400x400px donc tout au plus ceil(400*400/9) < 20 000 les points de données seraient visibles.


vous pouvez également essayer de séparer l'intrigue en petits morceaux - comme parcelle de 1000 points, le problème drawnow puis les 1000 suivants jusqu'à ce que vous ayez fini. Si vous n'avez pas à attendre devant un écran vide.

0
répondu bdecaf 2012-11-09 09:58:22