2013-05-27 20 views
8

Spesso voglio tracciare un'immagine di differenza che va da un numero negativo a uno positivo. Il problema è che le mappe di matlab scalano solo dal valore minimo al valore massimo, ma non si preoccupano di un valore medio (questo caso zero). Per esempio, ho prodotto l'immagine peaks con un singolo pixel diversa:Costruzione automatica di una mappa di colori attorno al valore zero

enter image description here

dove gli sguardi originali come questo:

enter image description here

Quindi valori zero sono blu l'immagine in alto e verde in basso ... (usando jet mappa colori come esempio)

Vorrei costruire una mappa colori che rappresenterà automaticamente i valori zero come lo stesso colore non importa quali saranno i valori min \ max. Come lo posso fare?

+0

Penso che si possa ottenere questo ridimensionando tutto ad un intervallo fisso prima del tracciamento, come '[-1,1]'. –

+0

usa colormapeditor: http://www.mathworks.de/de/help/matlab/ref/colormapeditor.html viene spiegato come mettere a fuoco il verde a zero – Enno

+0

Robocob ha chiesto espressamente un'implementazione automatica, quindi non avrebbe avuto bisogno di apri l'editor di colormap ogni volta ... – bla

risposta

4

è possibile utilizzare this tool dal FEX. Genera la colormap blu-bianco-rosso, con zero corrisponde sempre al colore bianco. Per il caso in cui desideri includere più di due colori, scava nel code e adattalo alle tue esigenze.

Ci sono alcune più opzioni in FEX che fanno cose simili (ecco one e another one) ... enter image description here

9

La mappatura del colore può essere controllata usando la funzione caxis (che imposta la proprietà di CLim l'oggetto degli assi correnti). L'assunzione è ovviamente che è in uso una mappatura del colore in scala, al contrario della mappatura del colore diretta (leggi la proprietà CDataMapping). Usando un intervallo centrato sullo zero come input, puoi assicurarti che lo zero sia sempre nel mezzo.

Ecco un esempio:

load penny 
P = 4*(P./255) - 1;  %# not centered around zero 
imagesc(P), axis image off 
colormap(lbmap(64,'BrownBlue')), colorbar 

skewed_range

Ora regolare la mappatura dei colori per rendere più simmetrica intorno allo zero:

c = max(abs([min(P(:)),max(P(:))])); 
caxis([-c c]) 

symmetric_range

nota che io sono utilizzando il Light Bartlein color scheme h è stato progettato come una tavolozza divergente per evidenziare le differenze tra due estremi.

Se la gamma originale è molto distorta, si potrebbe desiderare di ricampionare la mappa colori per dare più valori nel sotto-intervallo che è troppo teso.

+0

grazie Amro, ma se capisco correttamente l'utilizzo di questo presuppone che ho bisogno di centrare la mia mappa intorno a zero, dove la maggior parte delle volte i limiti inferiore e superiore non sono simmetrici intorno allo zero. Quindi il modo per affrontarlo è impostare i limiti su qualsiasi valore assoluto sia maggiore, immagino. –

+0

Sì, ho pensato che fosse applicabile per voi ... Dopo tutto ci sono molte applicazioni in cui il valore zero è significativo (per esempio mostrando mappe topografiche con il livello del mare rappresentato a zero). Il modo più semplice era usare un intervallo di colori centrato sullo zero, con una mappa di colori simmetrica appropriata e lasciare che MATLAB eseguisse il ridimensionamento. L'altro approccio consiste nel costruirlo a tratti, poiché ogni pezzo è una mappatura lineare tra due punti finali, in questo modo si potrebbero avere tanti "nodi" come si desidera (simile al 'colormapeditor' menzionato sopra) – Amro

+0

+1 per' caxis'. ... – bla

3

Mi piacciono le altre risposte, in particolare quella di @Amro. Ma sembra così complicato :) E i tuoi parametri caxis non devono dipendere dal tuo input, puoi semplicemente afferrarli dall'asse. Tutto questo può essere un one-liner:

a = gca; % or whatever you use to access your axis handle 
a.CLim = max(abs(a.CLim)) * [-1 1]; 

Questo è tutto. Funziona in MATLAB R2014b in poi, che ha il nuovo sistema di gestione delle figure (vedi dettagli here).Nelle versioni precedenti (e quelli nuovi, se si preferisce), si usa

a = gca; % or whatever you use to access your axis handle 
set(a, 'CLim', max(abs(get(a, 'CLim'))) * [-1 1]); 

o, usando caxis,

a = gca; % or whatever you use to access your axis handle 
caxis(a, max(abs(caxis(a))) * [-1 1]); 

automatizzare questo è abbastanza facile così:

a = gca; % or whatever you use to access your axis handle 
addlistener(a, 'CLimMode', 'PostSet', @(h, e) caxis(e.AffectedObject, max(abs(caxis(e.AffectedObject))) * [-1 1])); 

Questo ti permette di farlo

for ii = -5 : 5 
    imagesc([-1 0 10^ii]); 
    pause(0.2); 
end 

e la striscia centrale (che rappresenta 0) è sempre il colore centrale della barra di colore.

+2

Grazie per 'addlistener'. Non sapevo che esistesse, ma sembra molto utile. – Scz