如何用颜色和数值显示矩阵的可视化?

49
4个回答

91

您可以使用内置的函数imagesctext以及调整多个图形对象的参数来轻松创建此类图。以下是一个例子:

mat = rand(5);           % A 5-by-5 matrix of random values from 0 to 1
imagesc(mat);            % Create a colored plot of the matrix values
colormap(flipud(gray));  % Change the colormap to gray (so higher values are
                         %   black and lower values are white)

textStrings = num2str(mat(:), '%0.2f');       % Create strings from the matrix values
textStrings = strtrim(cellstr(textStrings));  % Remove any space padding
[x, y] = meshgrid(1:5);  % Create x and y coordinates for the strings
hStrings = text(x(:), y(:), textStrings(:), ...  % Plot the strings
                'HorizontalAlignment', 'center');
midValue = mean(get(gca, 'CLim'));  % Get the middle value of the color range
textColors = repmat(mat(:) > midValue, 1, 3);  % Choose white or black for the
                                               %   text color of the strings so
                                               %   they can be easily seen over
                                               %   the background color
set(hStrings, {'Color'}, num2cell(textColors, 2));  % Change the text colors

set(gca, 'XTick', 1:5, ...                             % Change the axes tick marks
         'XTickLabel', {'A', 'B', 'C', 'D', 'E'}, ...  %   and tick labels
         'YTick', 1:5, ...
         'YTickLabel', {'A', 'B', 'C', 'D', 'E'}, ...
         'TickLength', [0 0]);

这是生成的图形:

alt text

如果您选择的x轴刻度标签太宽并且彼此重叠导致出现问题,您可以这样解决:

  • 较新版本的MATLAB: 不确定是在哪个版本中添加的,但在较新的版本中,坐标轴对象现在具有属性 '{X|Y|Z}TickLabelRotation',允许您旋转标签并更好地适应它们。

  • 较旧版本的MATLAB: 对于较旧的版本,您可以在MathWorks文件交换上找到一些提交内容,可以旋转刻度标签文本,例如Brian KatzXTICKLABEL_ROTATE


4
为了得到一个更通用的解决方案,您应该将颜色文本与灰度色图背景上的mean(get(gca,'CLim'))进行比较,而不是0.5 - Amro
1
另一个备注(我发誓这是最后一个!):如果值具有长字符串和短字符串(比如 mat=rand(5)*1000; mat(1)=1; mat(2)=1000;),由于填充的空格,文本不会居中。您可以尝试做:textStrings = strtrim( cellstr(textStrings) ); - Amro
@Amro:这也是一个很好的建议。我之前忽略了它,因为我发布的第一个解决方案实际上是使用CELLFUN直接从单元数组创建字符串,所以一开始就没有填充。我改变了解决方案,使其更容易阅读。 - gnovice
我希望我能做更多的事情,而不仅仅是点赞。 - guneykayim
这很棒! Octave的一个模块:在设置hStrings颜色之前,我不得不添加textColors = +textColors将逻辑值转换为双精度。我猜Octave对于该设置的数据类型必须更加挑剔。 - Nick Benes
显示剩余2条评论

18

1

如果你看一下文件交换,你可能会发现有人已经写了代码,我相信你可以说服Matlab画出来。但是如果你没有代码的话,使用MS Excel会更容易。

编辑:我再仔细想了一下,这是我的想法。我还没有掌握将图形发布到SO上,所以请相信我,这会引导你找到解决方案。但是用Excel会更容易。

首先定义一个包含数据值的矩阵;在下面的内容中,我称该矩阵为G。然后执行以下命令:

image(G); 
colormap(gray)

现在,我必须进行一些调整数据的操作,以获得一个好的图形,但这应该会产生一个带有数字轴的灰度图。现在,转到您的图形窗口并打开绘图工具。

选择X轴并点击Ticks按钮。现在你所要做的就是编辑标签为你想要的文本。对于Y轴也是同样的操作。将数字写入图表上的方框中--使用注释菜单中的文本框。

经过很多尝试,你会得到你想要的图形。此时,我建议您选择菜单命令文件|生成M文件并执行此操作。如果您想在未来以编程方式创建这样的图形,只需将生成的M文件转换为执行您想要的操作的适当函数即可。

但在Excel中做这件事还是容易得多。


1

如果您只关心矩阵中零/非零元素的查看(例如,如果它是稀疏矩阵),请使用 spy

否则,请使用 imagesc

附注:我无法访问您的图像


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