2013-08-23 95 views
4

Matlab有一個函數spy用於可視化圖鄰接矩陣的稀疏模式。使用Matlab spy函數可視化稀疏模式與強度

不幸的是,它不考慮矩陣中值的大小來顯示點。它使用相同強度的單一顏色來顯示所有條目。

我希望顯示相同的間諜情節,但與熱圖中的點「顏色編碼」,以指示條目的規模。我怎樣才能做到這一點?

回答

4

如果你的矩陣不是很大,你可以嘗試使用imagesc()作爲圖像查看它。 (當然你可以使用它在相當大的矩陣爲好,但像素變得非常小。)

這裏是在100x100矩陣20隨機點的例子,使用顏色表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') 

這是由此產生的圖像。

Imagesc using colormap hot

這可以比我們開始使用spy(data)其中所述標誌物是一個大一點的情節。

Reference figure using spy

如果一個白色背景期望一種簡單的方法來實現,這是翻轉顏色表:

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

Imagesc using reversed colormap hot

哈克溶液重新定義間諜()

用谷歌搜索一下,我在Matlab中找到了這個線程:

Spy with color for values?

有一個解決方案建議重新定義spy()。不過值得注意的是(進一步在線程中)這個解決方案也可能導致Matlab崩潰以便處理更大的矩陣。

+0

感謝您的回覆。看起來,間諜給出了一個稍微不同的結果......它重新排序矩陣的行或以任何方式改變它?對於例如第二個圖的右下角有一個藍點,在第一個圖的右下角沒有。或者它的價值是如此之小以至於imagesc無法顯示它?這在文檔中沒有提及。 – lightalchemist

+0

@lightalchemist是的,這是事實,小的值很容易與背景混合。你可能會想用它作爲間諜的補充,以瞭解非零元素的規模。 – user1884905

+0

@lightalchemist顏色地圖的限制和比例可能會被調整以更清晰地顯示出小的值。 – user1884905

5

spy功能使用plot,在lineseries對象中不能具有不同的標記顏色。

另一方面,patch對象可以針對不同的頂點具有不同的標記顏色。 patch最初用於繪製多邊形,但沒有臉部顏色和邊緣顏色,可以得到與plot類似的結果,沒有線條樣式。

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>

您可以輕鬆地使用不同的顏色表,例如,colormap(flipud(hot))

Result with reversed <code>hot</code>

+0

+1尼斯解決方案。在很多情況下,MarkerSize可以任意設置的事實可能會比我的解決方案更有用。 – user1884905

+0

評論你的代碼將是非常有益的,謝謝。 – Veridian

1

我提交了一份關於MATLAB交換的文件也執行spy任務與根據自己的價值彩色點。請參閱here