2012-11-17 59 views
3

我想有一個如下面的曲線圖,但有一個適當的顏色條。如何在MATLAB中將自定義顏色範圍與顏色條結合起來?

plot without colorbar

這是我的代碼:

[X,Y,Z] = peaks(30); 

[maxval dummy] = max(Z(:)); 
[minval dummy] = min(Z(:)); 

crange = 1.5; 

% red, yellow, green 
cmap = [1 0 0; 1 1 0; 0 1 0]; 
colormap(cmap); 

colors = zeros(size(Z));     
colors(Z <= -crange) = 1;    % red (1) 
colors(Z > -crange & Z < crange) = 2; % yellow (2) 
colors(Z >= crange) = 3;    % green (3) 

surf(X,Y,Z, colors); 
axis([-3 3 -3 3 -10 10]); 

%cbh = colorbar('YGrid','on');  
%caxis([minval-0.1 maxval+0.1]); 
%set(cbh,'YTick',[minval -crange crange maxval]); 

到目前爲止,我沒有運氣在增加,其中的顏色(綠,黃,紅)根據我的自定義範圍內對齊的彩條(綠[8 ... 1.5],黃色[1.5 ... -1.5],紅色[-1.5 ... -6.4])。相反,當我取消註釋最後三行 時,會出現線性對齊顏色的顏色條,並且我的繪圖中的顏色會根據顏色條對齊而不是我自定義的範圍。

plot with colorbar

現在,我想有是,在彩條的顏色搭配我的自定義蜱和情節看起來像在第一張照片。

回答

4

問題在於你自己指定衝浪圖中每個點的顏色,所以它們與默認情況下與z值無關。其顏色條僅由顏色編號構成,爲1至3.這些因此也顯示爲顏色條的缺省滴答(在您更改顏色條之前)(

正如您發現的,您可以手動設置滴答,並以同樣的方式,你可以「騙」和使用yticklabels

figure 
colormap(cmap); 
surf(X,Y,Z, colors); 
axis([-3 3 -3 3 -10 10]); 

cbh = colorbar('YGrid','on'); 
set(cbh,'ytick',linspace(1,3,4)); 
set(cbh,'yticklabel',arrayfun(@num2str,[minval -crange crange maxval],'uni',false)); 

enter image description here

或者另一種方式是簡單地使用caxis,但隨後的情節顏色線性由極小極大值定義。因此,你不能設置你的非線性範圍
插圖:

figure 
colormap(cmap); 
surf(X,Y,Z); 
axis([-3 3 -3 3 -10 10]); 
caxis([minval-0.1 maxval+0.1]); 
cbh=colorbar 
set(cbh,'YTick',[minval -crange crange maxval]); 

enter image description here

所以畢竟,我想我的第一種方法(使用yticklabels)是做你想要什麼的唯一途徑。

1

我知道這是一個瘋狂的舊帖子,但它是在我尋找答案時才提出來的。這裏是我的答案(不得不承認,彩條上的刻度尺寸是相同的)。

所以,假設你製作了只有3種顏色的彩色地圖,下一部分就是代數。 caxis遵循一個簡單的公式,該公式由顏色條中的顏色數以及最小和最大範圍決定。

index = fix((C-cmin)/(cmax-cmin)*m)+1; 

那麼指數將參考在彩色地圖索引(M = 3,因爲那是你的顏色表的長度),我會做的是使C = 1.5,決定是否需要它的對稱(你正在求解cmax和cmin,如果兩者都是x),並且使索引= 2(因爲你只有3種顏色,這意味着求解1.5會給你cmin/cmax來設置哪一個會使得1.5的截斷值在黃色和紅色之間,你應該可以在某個地方設置顯示範圍值,這將會適當地設置色彩地圖(儘管可能不是標籤)

對不起,回覆這樣一箇舊帖子,但也許這會幫助其他人。

0

當我找到解決方案時遇到了這個問題。無論如何,這個問題幫助我在對書寫代碼進行小小的修改之後爲我的問題找到了一個解決方案。 同時,我希望對代碼提出一些更改,以便用戶可以使用必要的顏色和相應的顏色條獲取所需的繪圖。 下面是代碼,

[X,Y,Z] = peaks(30); 
 

 
[maxval dummy] = max(Z(:)); 
 
[minval dummy] = min(Z(:)); 
 

 
crange=1.5; 
 

 
% red, yellow, green 
 
cmap = [1 0 0; 1 1 0; 0 1 0]; 
 
colormap(cmap); 
 

 
colors = zeros(size(Z));     
 
colors(Z <= -crange) = minval-0.1;    % red (1) 
 
colors(Z > -crange & Z < crange) = crange; % yellow (2) 
 
colors(Z >= crange) = maxval+0.1;    % green (3) 
 

 
surf(X,Y,Z, colors); 
 
axis([-3 3 -3 3 -10 10]); 
 

 
cbh = colorbar('YGrid','on');  
 
caxis([minval-0.1 maxval+0.1]); 
 
set(cbh,'YTick',[minval -crange crange maxval]);

Plot