2016-09-15 188 views
1

我在matlab中工作,我有一个矩阵,我想通过给每列/行的最低值赋予绿色的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..0583 0.0583 
0.0363 0.0337 0.0500 0.0497 0.0038 0.0583 

我想达到的目标是这样的:

enter image description here

有没有办法无论如何要达到以上的结果?

我正在检查pcolor或imagesc的功能,但我无法与之相处。我发现这些链接herehere,他们试图做类似的事情,但我无法让它改变我的需求。因此,有没有人知道是否有可能做这样的事情?

谢谢。


更新:

在此我也想补充的顶部和侧面部分的标题栏的情况下,看下面:

enter image description here

+0

它看起来像你试图迫使MATLAB EXCEL ... – EBH

+1

只是想节省从matlab转移到Excel的时间。由于我只需要可视化部分,并且可以在matlab中直接完成,所以为此花费时间。我想你的答案也会帮助其他人。干得好,再次感谢;-)。 – ThT

回答

2

下面是一个简单的选择:

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..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') 

这给:

minfig

,你可以改变headersbackminima颜色,以满足您的首选风格。

+0

感谢您的答案,因为这个原因你得到了正确的答案Rotem的答案似乎更有效率。但是,如果我还想添加一些标题栏,请在我的初始文章中查看我的更新。 – ThT

+0

完美,这是诀窍。再次感谢:-) – ThT

+1

我还发现for循环可以跳过以下替代代码: rows = 1:size(A,2); linInd = sub2ind(size(A),ind,rows); B(linInd)= 1; B(linInd)= 1; 并且可以添加一些透明度: 他= imagesc(B); set(他,'AlphaData',0.5); – ThT

2

你可以找到最低在每一列上创建一个矩阵,将一种颜色与最小值的相应索引关联起来。

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

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

同样,您可以创建一个函数为每个值指定所需的颜色。 如果您要打印每个值的字符串,可以使用文本功能。

+0

谢谢@serigado您的回答与BMH的答案相同;-) – ThT

+0

实际上,BMH的答案是从我的,我实现彩条和添加字符串文本函数,正如我所说的。 – serigado

+0

说实话,我写我的时候并没有看到你的答案。只有在我发布之后,我才看到你向同一方向提出了一些建议。我决定放弃它,因为它提供了完整的解决方案,其他部分也很重要(比如如何正确使用'text')。无论如何,你也得到我的upvote;) – EBH

1

您可以使用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..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中的较新版本(比以前更高版本),你也可以选择字体。

enter image description here

+0

谢谢你的答案。尽管对于您的解决方案,我认为您可以针对EBH的回答应用更多的自定义设置,我认为EBH的代码行更易于理解和高效。如果我能将你的答案标记为正确,我会这样做,但不幸的是我不能。你有我的upvote虽然;-)。加入一些标题栏怎么样? – ThT

+0

EBH的回答非常好,他也从我这里得到了赞赏。 – Rotem