使用Matlab间谍函数可视化稀疏度模式

时间:2013-08-23 05:08:52

标签: matlab graph plot

Matlab有一个函数spy,用于可视化图邻接矩阵的稀疏模式。

不幸的是,它没有通过考虑矩阵中值的大小来显示这些点。它使用具有相同强度的单一颜色来显示所有条目。

我希望显示相同的间谍情节,但是在热图中使用“颜色编码”这些点来指示条目的大小。我怎么能这样做?

3 个答案:

答案 0 :(得分:5)

spy函数使用plotlineseries对象中的标记颜色不同。

另一方面,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>

答案 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')

这是生成的图像。

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

Hack解决方案重新定义spy()

谷歌搜索了一下我在Matlab Central找到了这个帖子:

Spy with color for values?

建议重新定义spy()的解决方案。然而值得注意的是(进一步在线程中)此解决方案也可能导致Matlab崩溃以获得更大的矩阵。

答案 2 :(得分:1)

我在matlab交换机上提交了一个文件,该文件还执行spy任务,其中的点根据其值着色。请参阅here