2016-07-01 8 views
1

Ich habe Daten, die als Verhältnis aufgebaut ist, und daher möchte ich eine rot/weiß/blau Colormap verwenden, wo weiß ist 1 zugeordnet und rot und blau umgeben es. Gibt es einen einfachen Weg, dies zu tun?Matlab Colormap symmetrisch über 1

Antwort

0

Sie können einfach eine blau-weiß-gelesene Colormap mit interp1 erstellen. Hier ist eine kleine anonyme Funktion, die eine Ganzzahl als Eingabe verwendet und eine Colormap erstellt.

bwr = @(n)interp1([1 2 3], [0 0 1; 1 1 1; 1 0 0], linspace(1, 3, n), 'linear') 
colormap(bwr(64)); 

Um zu steuern, wo die weißen Anrufe, Sie werden die CLim der Achsen festlegen möchten. Sie werden Ihre Clims um den Wert zentrieren wollen, der weiß sein soll.

set(gca, 'clim', [0 2]) 

Und als vollwertiges Beispiel:

data = reshape(linspace(0, 100, 16), [4 4]) ./ 50; 
figure 
imagesc(data); 
colormap(bwr(64)); 
colorbar; 
set(gca, 'clim', [0 2]) 

enter image description here

Beachten Sie aber, dass da Sie ein Verhältnis haben, werden alle Werte zwischen 0 und 1, während die Werte komprimiert werden > 1 kann theoretisch bis ins Unendliche gehen. Als Beispiel:

data = reshape(linspace(1, 200, 16), [4 4]) ./ 50; 

enter image description here

Um dies zu korrigieren Sie Ihre Daten vor dem Auftragen von log-Transformation könnte und dann die Markierungen colorbar tick ändern Ihre anfängliche Verhältnis Werte darzustellen.

LData = log(data); 
imagesc(LData) 
colormap(bwr(64)); 

cbar = colorbar(); 

set(gca, 'clim', [-1 1] * max(abs(LData(:)))) 

cticks = get(cbar, 'Ticks'); 
cticklabels = arrayfun(@(x)sprintf('%0.2f', x), exp(cticks), 'uniformoutput', false); 
set(cbar, 'TickLabels', cticklabels); 

enter image description here

+0

Brilliant, das funktioniert! Ich danke dir sehr! – agold2121