2010-03-30 11 views
14

Sto usando matplotlib per tracciare immagini normalizzate per il log ma vorrei che i dati originali dell'immagine grezza venissero rappresentati nella barra dei colori piuttosto che l'intervallo [0-1]. Ho la sensazione che ci sia un modo più semplice di farlo usando una sorta di oggetto di normalizzazione e non trasformando i dati in anticipo ... in ogni caso, potrebbero esserci valori negativi nell'immagine grezza.Come posso disegnare un grafico di imshow normalizzato con il log con una colorbar che rappresenta i dati grezzi in matplotlib

import matplotlib.pyplot as plt 
import numpy as np 

def log_transform(im): 
    '''returns log(image) scaled to the interval [0,1]''' 
    try: 
     (min, max) = (im[im > 0].min(), im.max()) 
     if (max > min) and (max > 0): 
      return (np.log(im.clip(min, max)) - np.log(min))/(np.log(max) - np.log(min)) 
    except: 
     pass 
    return im 

a = np.ones((100,100)) 
for i in range(100): a[i] = i 
f = plt.figure() 
ax = f.add_subplot(111) 
res = ax.imshow(log_transform(a)) 
# the colorbar drawn shows [0-1], but I want to see [0-99] 
cb = f.colorbar(res) 

Ho provato con cb.set_array, ma che non sembra di fare nulla, e cb.set_clim, ma che ridimensiona completamente i colori.

+0

Quindi a quanto pare posso passare un'istanza di normalizzazione in imshow e l'immagine sarà normalizzato per me: res = ax.imshow (im, norm = mpl.colors.LogNorm()) Ancora, se allego una barra di colore, i valori sono impostati sui valori normalizzati piuttosto che sui dati non elaborati. –

risposta

27

Sì, c'è! Utilizzare LogNorm. Ecco un estratto di codice da un'utilità che ho scritto per visualizzare le matrici di confusione su una scala di registro.

from pylab import figure, cm 
from matplotlib.colors import LogNorm 
# C = some matrix 
f = figure(figsize=(6.2,5.6)) 
ax = f.add_axes([0.17, 0.02, 0.72, 0.79]) 
axcolor = f.add_axes([0.90, 0.02, 0.03, 0.79]) 
im = ax.matshow(C, cmap=cm.gray_r, norm=LogNorm(vmin=0.01, vmax=1)) 
t = [0.01, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0] 
f.colorbar(im, cax=axcolor, ticks=t, format='$%.2f$') 
f.show() 
+0

Ottima risposta! Ma perché hai incluso i simboli $ nel formato sulla penultima riga? Se li si lascia fuori, le etichette degli assi saranno in un carattere san-serif e corrisponderanno al resto delle etichette degli assi. – DanHickstein

+0

Buon punto; Probabilmente ho appena copiato e incollato dal codice esistente. Mi piace LaTeXize il mio testo di trama. –

Problemi correlati