Matlab有一個函數spy用於可視化圖鄰接矩陣的稀疏模式。使用Matlab spy函數可視化稀疏模式與強度
不幸的是,它不考慮矩陣中值的大小來顯示點。它使用相同強度的單一顏色來顯示所有條目。
我希望顯示相同的間諜情節,但與熱圖中的點「顏色編碼」,以指示條目的規模。我怎樣才能做到這一點?
Matlab有一個函數spy用於可視化圖鄰接矩陣的稀疏模式。使用Matlab spy函數可視化稀疏模式與強度
不幸的是,它不考慮矩陣中值的大小來顯示點。它使用相同強度的單一顏色來顯示所有條目。
我希望顯示相同的間諜情節,但與熱圖中的點「顏色編碼」,以指示條目的規模。我怎樣才能做到這一點?
如果你的矩陣不是很大,你可以嘗試使用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')
這是由此產生的圖像。
這可以比我們開始使用spy(data)
其中所述標誌物是一個大一點的情節。
如果一個白色背景期望一種簡單的方法來實現,這是翻轉顏色表:
figure
imagesc(data)
axis square
cmap = flipud(colormap('hot'));
colormap(cmap)
哈克溶液重新定義間諜()
用谷歌搜索一下,我在Matlab中找到了這個線程:
有一個解決方案建議重新定義spy()
。不過值得注意的是(進一步在線程中)這個解決方案也可能導致Matlab崩潰以便處理更大的矩陣。
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();
您可以輕鬆地使用不同的顏色表,例如,colormap(flipud(hot))
。
+1尼斯解決方案。在很多情況下,MarkerSize可以任意設置的事實可能會比我的解決方案更有用。 – user1884905
評論你的代碼將是非常有益的,謝謝。 – Veridian
我提交了一份關於MATLAB交換的文件也執行spy
任務與根據自己的價值彩色點。請參閱here。
感謝您的回覆。看起來,間諜給出了一個稍微不同的結果......它重新排序矩陣的行或以任何方式改變它?對於例如第二個圖的右下角有一個藍點,在第一個圖的右下角沒有。或者它的價值是如此之小以至於imagesc無法顯示它?這在文檔中沒有提及。 – lightalchemist
@lightalchemist是的,這是事實,小的值很容易與背景混合。你可能會想用它作爲間諜的補充,以瞭解非零元素的規模。 – user1884905
@lightalchemist顏色地圖的限制和比例可能會被調整以更清晰地顯示出小的值。 – user1884905