【问题标题】:Coloring a matrix in matlab [duplicate]在matlab中为矩阵着色[重复]
【发布时间】:2011-10-27 23:18:26
【问题描述】:

可能重复:
How do I visualize a matrix with colors and values displayed?

我基本上有一个NxN(编辑:N 可以高达 80)在 MATLAB 中的双精度矩阵,我什么时候将它绘制为一个数组(我想查看数字)并且一些单元格应该是彩色的(决定如何为数字着色的功能与数字无关)。

我已经想到了不同的方法来做到这一点:

  • 创建一个网格作为图像并用文本覆盖它,但 MATLAB 的绘图会很糟糕,因为它会删除一些像素来调整图像的大小(我的矩阵可以在 80x80 附近)。

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

有什么帮助吗?

图片有时更有帮助:

【问题讨论】:

标签: image matlab colors matrix plot


【解决方案1】:

【讨论】:

  • 谢谢,但这并不能解决我的问题:我的颜色与矩阵中的值无关。我只想在上面绘制我的文字。但问题是matlab调整了matlab的大小,我丢失了一些像素,如果我按照你说的做,它看起来一点也不好看。
【解决方案2】:

在 Excel 中,您始终可以使用条件格式,没有问题。

就 matlab 而言,我从来没有做过类似的事情(尽管我已经想到了这个想法)。你有没有想过这样的事情How do I visualize a matrix with colors and values displayed?

【讨论】:

  • 是的,但是随着我的矩阵变大,matlab 中的绘图看起来会很糟糕......我可以做的是将图像中的文本作为像素而不是作为文本对象保存图像而不是绘制它。知道怎么做吗?
  • @johnCastle - 对不起,不。我不使用 matlab - 这是我在快速搜索中发现的,因为它看起来是个好主意。
【解决方案3】:

如果您愿意输出为 html(通常使用 matlab 的发布功能),您可以修改文件交换中的许多 html 表函数之一以满足您的需要。这里是one example。这将使您能够输出文本和颜色。

【讨论】:

  • 谢谢,好主意。不过现在为时已晚,我已经完成了我的功能......基本上,我的主要问题是我不能使用 matlab print 因为我的矩阵太大了,所以我在图像的一小部分上使用了功能 print 并将一切都回到图像中。不过速度有点慢。
【解决方案4】:

考虑以下代码:

%# 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');

随着矩阵大小的增加,文本最终会重叠...


编辑

这是一种适用于较大矩阵的方法:我们使用不可见的图形,将其调整为足够大的大小,并使用较小的字体(我使用了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

你可以看到output file here(10025x5962 图片,645KB)

【讨论】:

  • 当 N 变得太大(例如 N=30)时,我们看不到任何不适合我的东西。
  • @JohnCastle:IMO 你必须重新考虑你的可视化,因为你不可能绘制那么多文本并且仍然期望它清晰可见(我们显然在屏幕上的像素数量有限) ..
  • 我现在设法做一个适合我的功能,我创建了一个用 matlab 生成的图像,但我通过 windows 可视化器看到它,我可以放大或缩小以查看我想要的内容。
  • @JohnCastle:那么你应该分享你的代码,因为它可能会帮助未来的读者......无论如何,请参阅我最近的编辑以解决你的问题(我用N=80尝试过)
  • 太好了,我不知道您可以更改文件的分辨率。我的解决方案是为每个包含文本的单元格创建一个小图像,打印它并将结果放入一个代表最终图像的大数组中,然后写入图像。不过时间太长了。再次感谢:)
猜你喜欢
  • 1970-01-01
  • 2014-04-29
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多