在Matlab中给矩阵上色

6

可能是重复问题:
如何用颜色和数值显示矩阵?

我有一个 NxN(编辑:N可以高达80)的 MATLAB 双精度矩阵,我想将其绘制为数组(我想看到数字),并且其中一些单元格应该着色(决定如何着色与数字无关)。

我考虑了不同的方法:

  • 创建一个图像网格,并在其上叠加文本,但 MATLAB 的绘图效果会很差,因为它会删除一些像素来调整图像大小(我的矩阵可以大约为 80x80)。

  • 导出到 Excel?不知道如何着色单元格。

有什么帮助吗?

有时候图片更有帮助:

enter image description here


N可以等于100(最大值)。这就是为什么这个解决方案https://dev59.com/rm865IYBdhLWcg3wLrhE不适用。我想我会使用http://www.mathworks.com/support/solutions/en/data/1-1BALJ/?solution=1-1BALJ将文本写入图像,然后保存图像。 - JohnCastle
这并不是“完全重复”的(我的问题是处理高数量的单元格,而不是实际生成输出),但如果你这么说的话... - JohnCastle
4个回答

8
请看下面的代码:

考虑以下代码:

%# matrix
M = rand(11,11);
[r c] = size(M);

%# text location and labels
[xloc yloc] = meshgrid(1:c,1:r);
xloc = xloc(:); yloc = yloc(:);
str = strtrim(cellstr( num2str(M(:),'%.3g') ));
xticklabels = cellstr( num2str((1:c)','M%d') );
yticklabels = cellstr( num2str((1:r)','M%d') );

%# plot colored cells
mask = M>0.9;               %# or any other mask
h = imagesc(1:c, 1:r, ones(size(M)));
set(h, 'AlphaData',mask)
colormap(summer)            %# colormap([0 1 0])
set(gca, 'Box','on', 'XAxisLocation','top', 'YDir','reverse', ...
    'XLim',[0 c]+0.5, 'YLim',[0 r]+0.5, 'TickLength',[0 0], ...
    'XTick',1:c, 'YTick',1:r, ...
    'XTickLabel',xticklabels, 'YTickLabel',yticklabels, ...
    'LineWidth',2, 'Color','none', ...
    'FontWeight','bold', 'FontSize',8, 'DataAspectRatio',[1 1 1]);

%# plot grid
xv1 = repmat((2:c)-0.5, [2 1]); xv1(end+1,:) = NaN;
xv2 = repmat([0.5;c+0.5;NaN], [1 r-1]);
yv1 = repmat([0.5;r+0.5;NaN], [1 c-1]);
yv2 = repmat((2:r)-0.5, [2 1]); yv2(end+1,:) = NaN;
line([xv1(:);xv2(:)], [yv1(:);yv2(:)], 'Color','k', 'HandleVisibility','off')

%# plot text
text(xloc, yloc, str, 'FontSize',8, 'HorizontalAlignment','center');

screenshot

当矩阵变大时,文本最终会重叠...


编辑

这里有一种适用于更大矩阵的方法:我们使用一个不可见的图形,将其调整为足够大的尺寸,并使用较小的字体大小(我使用了2):

M = rand(80,80);

figure('visible','off')
set(gcf, 'Units','Pixels', 'Position', [0, 0, 10000, 10000], ...
     'PaperPositionMode','Auto');
set(gca, 'units','normalized', 'position',[0.05 0.02 0.9 0.95])

%# ... 

最后,以高分辨率导出文件:

%# ...

print -dpng -r600 file.png

您可以在此处查看输出文件(10025x5962 图像,645KB):链接

当N变得太大时(例如N=30),我们无法看到任何不合适的东西,这让我感到不满意。 - JohnCastle
@JohnCastle:在我看来,你需要重新考虑你的可视化设计,因为你不可能绘制那么多文本并期望它仍然清晰可见(显然我们屏幕上的像素数量是有限的)。 - Amro
我成功地创建了一个适合我的函数,我用Matlab生成了一张图像,但是我通过Windows可视化器查看它时,可以放大或缩小以查看我想要的内容。 - JohnCastle
@JohnCastle:你应该分享你的代码,因为它可能会帮助未来的读者... 无论如何,看看我的最近编辑,解决了你的问题(我用N=80试过了)。 - Amro
太好了,我不知道你可以更改文件的分辨率。我的解决方案是为每个带有文本的单元格创建一个小图像,将其打印并将结果放入表示最终图像的大数组中,然后imwrite该图像。不过这太费时间了。再次感谢 :) - JohnCastle

1

如果你想要输出到HTML(通常使用Matlab的发布功能),你可以修改文件交换中的许多HTML表格函数来满足你的需求。这里有一个例子。这将使你能够输出文本以及颜色。


谢谢,好主意。不过现在已经太晚了,我已经完成了我的函数...基本上,我的主要问题是我无法使用Matlab打印功能,因为我的矩阵太大了,所以我使用了在图像的小部分上打印的函数,并将所有内容放回图像中。虽然有点慢。 - JohnCastle

0

谢谢您的回答,但它并不能解决我的问题:我的颜色与矩阵中的数值无关。我只想在上面绘制文本。但是问题是Matlab会调整大小,我会失去一些像素,并且如果我按照您所说的做,它看起来并不好。 - JohnCastle

0
在Excel中,您始终可以使用条件格式设置,没有任何问题。
就Matlab而言,我从未做过这样的事情(尽管这个想法曾经在我脑海中闪过)。您是否考虑过像这样的东西如何使用颜色和值显示矩阵?

是的,但是由于我的矩阵可能会很大,所以在Matlab中绘制的图形看起来会相当糟糕...我可以尝试将图像中的文本作为像素而不是文本对象,并保存图像而不是绘制它。有什么想法吗? - JohnCastle
@johnCastle - 抱歉,我不使用matlab - 我只是在快速搜索中找到了这个,因为它似乎是一个好主意。 - Rook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接