Matlab有一个函数spy,用于可视化图邻接矩阵的稀疏模式。
不幸的是,它没有通过考虑矩阵中值的大小来显示这些点。它使用具有相同强度的单一颜色来显示所有条目。
我希望显示相同的间谍情节,但是在热图中使用“颜色编码”这些点来指示条目的大小。我怎么能这样做?
答案 0 :(得分: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();
您可以轻松使用不同的色彩映射,例如colormap(flipud(hot))
。
答案 1 :(得分:4)
如果您的矩阵不是很大,您可以尝试使用imagesc()
将其视为图像。 (你可以将它用于相当大的矩阵,但像素变得非常小。)
以下是20
矩阵中100x100
个随机点的示例,使用色彩映射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)
Hack解决方案重新定义spy()
谷歌搜索了一下我在Matlab Central找到了这个帖子:
建议重新定义spy()
的解决方案。然而值得注意的是(进一步在线程中)此解决方案也可能导致Matlab崩溃以获得更大的矩阵。
答案 2 :(得分:1)
我在matlab交换机上提交了一个文件,该文件还执行spy
任务,其中的点根据其值着色。请参阅here。