2013-08-23 1 views
4

Matlab a une fonction spy pour visualiser les modèles de parcimonie des matrices d'adjacence de graphe.Visualisation du modèle de densité avec intensité à l'aide de la fonction d'espionnage Matlab

Malheureusement, il n'affiche pas les points en tenant compte de l'ampleur des valeurs dans la matrice. Il utilise une seule couleur avec la même intensité pour afficher toutes les entrées.

Je souhaite afficher le même tracé d'espionnage mais avec les points "codés en couleur" comme dans un heatmap pour indiquer l'ampleur des entrées. Comment puis je faire ça?

Répondre

4

Si votre matrice n'est pas très grande, vous pouvez essayer de l'afficher en tant qu'image en utilisant imagesc(). (Eh bien, vous pouvez l'utiliser pour les matrices assez grandes aussi bien, mais les pixels deviennent très petit.)

Voici un exemple de 20 points aléatoires dans une matrice 100x100, en utilisant colormap hot:

N = 100; 
n = 20; 

x = randi(N,1,n); 
y = randi(N,1,n); 
z = randi(N,1,n); 

data = sparse(x,y,z); 

imagesc(data) 
axis square 
colormap('hot') 

Cette est l'image résultante.

Imagesc using colormap hot

Cela peut être comparé à l'intrigue que nous obtenons en utilisant spy(data) où les marqueurs sont un peu plus grand.

Reference figure using spy

Si un fond blanc est souhaité un moyen facile d'y parvenir est de retourner la palette de couleurs:

figure 
imagesc(data) 
axis square 
cmap = flipud(colormap('hot')); 
colormap(cmap) 

Imagesc using reversed colormap hot

solution Hack redéfinissant espion()

Googling un peu J'ai trouvé ce fil chez Matlab Central:

Spy with color for values?

Il est une solution suggéré que redéfinit spy(). Il est cependant intéressant de noter que (plus bas dans le thread) cette solution peut aussi causer le crash de Matlab pour des matrices plus grandes.

+0

Merci pour la réponse. Il semble que l'espion donne un résultat légèrement différent ... réorganise-t-il les rangées de la matrice ou la modifie-t-elle de quelque façon que ce soit? Par exemple il y a un point bleu dans le coin inférieur droit de votre deuxième parcelle qui manque dans le premier. Ou pourrait-il être que sa valeur est si petite que l'image ne le montre pas? Ceci n'est pas mentionné dans les documents. – lightalchemist

+0

@lightalchemist Oui, c'est vrai, les petites valeurs se fondent facilement dans l'arrière-plan. Vous voudrez probablement l'utiliser comme un complément à l'espion, pour avoir une idée de l'échelle des éléments non nuls. – user1884905

+0

@lightalchemist Les limites et l'échelle de la palette de couleurs pourraient probablement être utilisées pour montrer plus clairement les petites valeurs. – user1884905

5

spy La fonction utilise plot, qui ne peut pas avoir différentes couleurs de marqueur dans un objet lineseries. D'autre part, l'objet patch peut avoir différentes couleurs de marqueur pour des sommets différents.

patch est à l'origine pour dessiner des polygones, mais sans couleur de face et sans couleur de contour, on peut obtenir un résultat similaire à plot sans style de ligne.

S = bucky(); 
[m, n] = size(S); 
[X, Y] = meshgrid(1:m, 1:n); 
S = (X + Y) .* S; 

nonzeroInd = find(S); 
[x, y] = ind2sub([m n], nonzeroInd); 

figure(); 
hp = patch(x, y, S(nonzeroInd), ... 
      'Marker', 's', 'MarkerFaceColor', 'flat', 'MarkerSize', 4, ... 
      'EdgeColor', 'none', 'FaceColor', 'none'); 
set(gca, 'XLim', [0, n + 1], 'YLim', [0, m + 1], 'YDir', 'reverse', ... 
    'PlotBoxAspectRatio', [n + 1, m + 1, 1]); 

colorbar(); 

Result with <code>jet</code>

Vous pouvez facilement utiliser différents colormap, par exemple, colormap(flipud(hot)).

Result with reversed <code>hot</code>

+0

+1 Bonne solution. Le fait que 'MarkerSize' puisse être défini arbitrairement le rend probablement plus utile que ma solution dans de nombreux cas. – user1884905

+0

Commenter votre code serait très utile, merci. – Veridian

1

J'ai présenté un dossier sur l'échange de Matlab qui effectue également la tâche spy avec des points de couleur en fonction de leur valeur. S'il vous plaît voir here.

Questions connexes