如何用特定颜色绘制matlab中矩阵的值

How to plot with specific colors the values of a matrix in matlab

我在 matlab 中工作,我有一个矩阵,我想通过为每个 column/row 的最低值提供 green-ish 颜色并为其余的 red-ish 提供 red-ish 颜色来可视化它或不同级别的 red-ish 取决于该值与最低值的接近程度,最后打印其中的值。例如,假设我有以下矩阵:

0.0085 0.0244 0.0335 0.0312 0.0392 0.0392
0.0246 0.0078 0.0234 0.0281 0.0395 0.0395
0.0299 0.0295 0.0108 0.0224 0.0598 0.0598
0.0253 0.0317 0.0236 0.0123 0.0583 0.0583
0.0363 0.0337 0.0500 0.0497 0.0038 0.0583

我想要实现的是这样的:

有没有办法达到上述结果?

我正在检查 pcolor 或 imagesc 函数,但我无法适应某些事情。我发现这些链接 here and here 它们试图做类似的事情,但我无法根据我的需要进行更改。因此,有人知道是否可以做类似的事情以及如何做吗?

谢谢。


更新:

如果我还想在顶部和侧面添加一些标题栏,请看下面:

您可以找到每一列的最小值,并创建一个矩阵,将颜色与对应的最小值索引相关联。

此示例为每列的最小值创建颜色。

[~, idx] = min(A);
M = zeros(size(A));
for iCol = 1:size(A,2)
    M(idx(iCol), iCol) = 1;
end
imagesc(M);

同样,您可以创建一个函数来为每个值分配所需的颜色。 如果你每个人要打印值的字符串,你可以使用文本函数。

您可以使用 insertText 创建它。

使用类似于以下示例的内容:

A = [0.0085 0.0244 0.0335 0.0312 0.0392 0.0392
     0.0246 0.0078 0.0234 0.0281 0.0395 0.0395
     0.0299 0.0295 0.0108 0.0224 0.0598 0.0598
     0.0253 0.0317 0.0236 0.0123 0.0583 0.0583
     0.0363 0.0337 0.0500 0.0497 0.0038 0.0583];

I = zeros(92, 348, 3, 'uint8');
I(:,:,1) = 255;I(:,:,2) = 199;I(:,:,3) = 206; %Background color

text_str = cell(length(A(:)), 1);
box_color = zeros(length(A(:)), 3);
text_color = zeros(length(A(:)), 3);
position = zeros(length(A(:)), 2);
for y = 0:size(A, 1)-1
    for x = 0:size(A,2)-1
        index = y*size(A,2) + x + 1;
        val = A(y+1, x+1);
        text_str{index} = [' ', num2str(val, '%0.4f'), ' '];
        position(index, 1) = x*58 + 1;
        position(index, 2) = y*18 + 1;
        if (val == min(A(:, x+1)))
            %Green
            box_color(index, :) = uint8([198, 239, 206]);
            text_color(index, :) = uint8([0, 100, 0]);
        else
            %Red
            box_color(index, :) = uint8([255, 199, 206]);
            text_color(index, :) = uint8([100, 0, 0]);
        end
    end
end

I = insertText(I, position, text_str, 'FontSize', 12, 'BoxColor', box_color, 'TextColor', text_color, 'BoxOpacity', 1);

figure;imshow(I);

注意:在较新版本的 Matlab 中(比我使用的新),您还可以 select 字体。

这是一个快速选项:

A = [0.0085 0.0244 0.0335 0.0312 0.0392 0.0392
    0.0246 0.0078 0.0234 0.0281 0.0395 0.0395
    0.0299 0.0295 0.0108 0.0224 0.0598 0.0598
    0.0253 0.0317 0.0236 0.0123 0.0583 0.0583
    0.0363 0.0337 0.0500 0.0497 0.0038 0.0583];
back = [1 0 0];
headers = [0.5 0.5 0.5];
minima = [0 1 0];
map = [back ; headers; minima];
colormap(map)
[~,ind] = min(A);
B = zeros(size(A));
for k = 1:size(A,2)
    B(ind(k),k) = 1;
end
B = [ones(1,size(B,2))*0.5;B];
B = [ones(size(B,1),1)*0.5 B];
imagesc(B)
axis off
[y,x]=ndgrid((1:size(A,1)),(1:size(A,2)));
row_titles = num2str((1:size(A,1)).'); % could be any vector...
text(ones(size(A,1),1),2:size(A,1)+1,row_titles,'FontSize',16,'HorizontalAlignment','center',...
    'VerticalAlignment','middle','Color','w')
coloumn_titles = num2str((1:size(A,2)).'); % could be any vector...
text(2:size(A,2)+1,ones(size(A,2),1),coloumn_titles,'FontSize',16,'HorizontalAlignment','center',...
    'VerticalAlignment','middle','Color','w')
text(x(:)+1,y(:)+1,num2str(A(:)),'FontSize',16,'HorizontalAlignment','center',...
    'VerticalAlignment','middle')

给出:

并且您可以更改 headersbackminima 颜色以适合您喜欢的风格。