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
1
A
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])
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;
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);
Brilliant, das funktioniert! Ich danke dir sehr! – agold2121