4

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

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

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

4

3 回答 3

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();

<code>jet</code> 的结果

您可以轻松使用不同的颜色图,例如colormap(flipud(hot)).

结果与反向 <code>hot</code>

于 2013-08-23T09:08:39.973 回答
4

如果您的矩阵不是很大,您可以尝试使用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')

这是生成的图像。

Imagesc 使用颜色图热

这可以与我们使用spy(data)的标记稍大的绘图进行比较。

使用spy的参考图

如果需要白色背景,实现此目的的简单方法是翻转颜色图:

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

Imagesc 使用反向颜色图 hot

重新定义 spy() 的破解解决方案

谷歌搜索了一下,我在 Matlab Central 找到了这个线程:

用颜色窥探价值?

有一个解决方案建议重新定义spy(). 然而值得注意的是(在线程的更下方)这个解决方案也可能导致 Matlab 在更大的矩阵中崩溃。

于 2013-08-23T08:51:48.240 回答
1

我在 matlab exchange 上提交了一个文件,该文件还spy根据其值用不同颜色的点执行任务。请看这里

于 2013-08-24T08:30:14.070 回答