2010-03-30 6 views
14

Ich benutze Matplotlib log-normalisierte Bilder zu plotten, aber ich möchte die ursprünglichen rohen Bilddaten in der Farbleiste statt dargestellt werden das [0-1] Intervall. Ich habe das Gefühl, dass es eine andere Möglichkeit gibt, dies zu tun, indem man eine Art Normalisierungsobjekt verwendet und die Daten nicht vorher transformiert ... auf jeden Fall könnte es negative Werte im Rohbild geben.Wie zeichne ich ein log-normalisiertes Imshow-Diagramm mit einer Farbleiste, die die Rohdaten 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) 

Ich habe versucht, cb.set_array verwenden, aber das scheint nichts zu tun, und cb.set_clim, aber das neu skaliert die Farben vollständig.

+0

So offenbar ich eine Normalisierung Instanz in imshow passieren kann und das Bild wird für mich normalisiert werden: res = ax.imshow (im, Norm = mpl.colors.LogNorm()) Immer noch, wenn ich eine Farbleiste anschließe, werden die Werte auf die normalisierten Werte und nicht auf die Rohdaten gesetzt. –

Antwort

27

Ja, gibt es! Verwenden Sie LogNorm. Hier ist ein Codeauszug aus einem Dienstprogramm, das ich geschrieben habe, um Verwirrungsmatrizen auf einer logarithmischen Skala anzuzeigen.

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

Große Antwort! Aber warum haben Sie die $ -Symbole in das Format auf der vorletzten Zeile eingefügt? Wenn Sie sie nicht angeben, werden die Achsenbeschriftungen in einer San-Serif-Schriftart angezeigt und stimmen mit den übrigen Achsenbeschriftungen überein. – DanHickstein

+0

Guter Punkt; Ich habe es wahrscheinlich einfach kopiert und aus dem vorhandenen Code eingefügt. Ich mag LaTeXize meinen Plottext. –

6

Wenn Sie nur das Bild wollen einloggen normiert werden (zur Verbesserung der Details), aber nicht die Daten (auf physikalische Werte zu erhalten), dann müssen Sie die Transformation auf dem colormap selbst anwenden. Sie können in dem Kochbuch gegeben mit der Funktion cmap_map() tun: http://www.scipy.org/Cookbook/Matplotlib/ColormapTransformations