2013-12-16 148 views
4

我想在第一張圖片中顯示不均勻的色條。我試過了下面的代碼。 'mycamp4'是手動保存的色彩映射表。結果如第二張圖所示。號碼0.11.5會太封閉太看。我怎樣才能使彩色條像第一張照片一樣?如何生成非線性顏色表/顏色條?

v = [0.1 1 1.5 5 7.5 10 30]; 
v_2 = [0.1 1.5 5 7.5 10 30]; 
contourf(X,Y,pdf_normal',v); 
h = colorbar; 
load('MyColormaps','mycmap4'); 
set(gcf,'Colormap',mycmap4); 
set(h, 'YTick', v_2) 

圖1:

enter image description here

圖2:

enter image description here

+0

也許這有助於:[對數彩條(http://www.mathworks.com/matlabcentral/newsreader/view_thread/152310) – thewaywewalk

+0

你的意思是你想要一個不統一的顏色表? 'colorbar'通常只顯示'colormap'是什麼。我假設你已經試過['colormapeditor'](http://www.mathworks.com/help/matlab/ref/colormapeditor.html)。您應該在文件交換中搜索自定義顏色映射。 – horchler

+0

Sidenote,第一張照片中的條似乎有30以上的值,而第二個彩條只顯示值直到30. –

回答

9

這裏一步一步解釋。

首先考慮下面的例子:

[X,Y,Z1] = peaks; 

figure(1) 
[~,h1] = contourf(X,Y,Z1,20); 
a1 = colorbar; 
colormap(jet) 
caxis([-6,6]) 

,這將給你如下情節:

enter image description here

它具有線性數據和線性顏色表。現在我想縮放Z-數據以獲得非線性,就像你的情況一樣。我選擇了一個簡單的數據平方。

Z2 = get(h1,'ZData'); 
scalefactor = @(x) sign(x).*x.^2; 
Z2 = scalefactor(Z2); 

這就是實際的數據。例如,類似於你:

figure(2) 
[~,h2] = contourf(X,Y,Z2,20); 
a2 = colorbar; 
colormap(jet) 
caxis([-6^2,6^2]) 

enter image description here

現在我們有非線性的數據,但仍然是一個線性colormapcolorbar

到目前爲止,所有事情都是爲了生成類似於您的示例數據。


現在實際的答案:

讓您的情節數據:

Z3 = get(h2,'ZData'); 

,並用關係,你希望知道它的規模或多或少:

descalefactor = @(x) sign(x).*abs(x).^(1/2); 
Z3 = descalefactor(Z3); 

繪製縮放數據:

figure(3) 
[~,h3] = contourf(X,Y,Z3,20); 
a3 = colorbar; 
colormap(jet) 
caxis([-6,6]) 

得到Y-Ticksscale it with the inverse function,像您的數據:

ticks = get(a3,'YTick'); 
ticks = scalefactor(ticks); 

設置這些inversly縮放彩條刻度:

set(a3,'YTickLabel',ticks) 

,你終於得到一個看似線性圖(但你可以只需從以前備份您的非線性數據),並帶有非線性顏色圖和顏色條刻度。

enter image description here

正如預期的那樣,曲線看起來像在第一示例中的相同,但有一個縮放彩條軸線。

如果您沒有任何功能關係,請嘗試獲取一個,例如用曲線擬合工具箱。

+0

嗨@thewaywewalk,非常感謝!它似乎工作。我會試一試! – user2230101

+0

快速提示:我發現,如果您更改窗口的大小以使顏色欄上的刻度線數量發生變化,它們將不再正確地匹配顏色條(事實上,如果新的勾號是添加)。調整圖形大小後,必須重新調整色彩條。 –

+0

@MarkH這是真的,這就是爲什麼你應該**創建**的數字已經在正確的大小。 – thewaywewalk

0

當您嘗試doc colorbar你會發現顏色表的參考。並嘗試doc colormap後,他們基本上提供3個選項來設置顏色映射。

  1. 輸入地圖(例如,一個由get或一個較早設計的獲得,這是你嘗試過什麼)
  2. 選擇內置與屬性編輯器顏色表。
  3. 使用顏色圖編輯器,可從圖形菜單上的編輯>顏色映射進行訪問。

@horchler已經提到過它,但我想你以前沒有聽說過colormap editor。因此我會懷疑選項3最適合你。

+0

親愛的丹尼斯, 非常感謝您的回覆。其實我已經嘗試了colormap ediotor(我的原始代碼中的「mycmap4」)。但它不會改變色譜的規模。例如,我希望0.1到1之間的距離與1到2.5之間的距離相同。我認爲@thewaywewalk提到的日誌比例顏色條接近我想要的。但我需要的不是一個對數刻度,而是一個「定製」刻度。 – user2230101

+0

然後,我看到的唯一方法就是將您的數據與您打算的關係完全線性化。然後使用自定義刻度標籤。 – thewaywewalk

1

您可以自定義顏色表和顏色條中的刻度,但顏色條本身是基於線性間隔的,並且不能更改。

雖然有一個解決方法。

可以說你想讓你的顏色條像圖片1中的N個非線性區間(例如color_limits = [1 2 20],如果N = 2)。 您必須:

1)爲您的數據定義另一個變量。例如

data2 = nan(size(data)); 
for i=1:N 
    b = data>color_limits(i) & data>=color_limits(i+1); 
    data2(b) = i-0.5; 
end 

基本上你是裝箱數據,在color_limits使用間隔,爲不同的變量DATA2,你將顯示

2)使你的DATA2

3)限定的彩條範圍的圖像: caxis([0 N])

4)用N種顏色定義色彩地圖,例如顏色表(噴射(N))

5)定製蜱在彩條