2016-09-15 183 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