Matlab 有一个函数spy用于可视化图邻接矩阵的稀疏模式。
不幸的是,它没有通过考虑矩阵中值的大小来显示这些点。它使用具有相同强度的单一颜色来显示所有条目。
我希望显示相同的间谍图,但在热图中使用“颜色编码”的点来指示条目的大小。我怎样才能做到这一点?
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))
.
如果您的矩阵不是很大,您可以尝试使用imagesc()
. (好吧,您也可以将它用于相当大的矩阵,但像素会变得非常小。)
20
这是矩阵中随机点的示例100x100
,使用 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')
这是生成的图像。
这可以与我们使用spy(data)
的标记稍大的绘图进行比较。
如果需要白色背景,实现此目的的简单方法是翻转颜色图:
figure
imagesc(data)
axis square
cmap = flipud(colormap('hot'));
colormap(cmap)
重新定义 spy() 的破解解决方案
谷歌搜索了一下,我在 Matlab Central 找到了这个线程:
有一个解决方案建议重新定义spy()
. 然而值得注意的是(在线程的更下方)这个解决方案也可能导致 Matlab 在更大的矩阵中崩溃。
我在 matlab exchange 上提交了一个文件,该文件还spy
根据其值用不同颜色的点执行任务。请看这里。