2012-04-12 17 views
18

Ich würde gerne zwei verschiedene Datensätze auf dem gleichen IMshow-Plot vergleichen, um die Unterschiede zu verdeutlichen. Mein erster Instinkt ist, um die Farben in der colormap transparent (die niedrigeren Werte vor allem) zu machen, aber ich habe nicht in der Lage gewesen, um diese Arbeit zu bekommen:Overlay imshl plots in matplotlib

from matplotlib.colors import colorConverter 
import matplotlib.pyplot as plt 
import numpy as np 

# create dummy data 
zvals = np.random.rand(100,100)*10-5 
zvals2 = np.random.rand(100,100)*10-5 

# generate the transparent colors 
color1 = colorConverter.to_rgba('white',alpha=0.0) 
color2 = colorConverter.to_rgba('black',alpha=0.8) 

# make the colormaps 
cmap1 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap',['green','blue'],256) 
cmap2 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap2',[color1,color2],256) 

img2 = plt.imshow(zvals,interpolation='nearest',cmap=cmap1,origin='lower') 
img3 = plt.imshow(zvals2,interpolation='nearest',cmap=cmap2,origin='lower') 

plt.show() 

Es gibt keine Fehler, aber die weiß und schwarz von der zweite Handlung zeigt keine Transparenz. Ich habe auch die colorConverter-Methode ausprobiert, um die Farbe in einer normalen plt.plot-Situation einzustellen, und die Farbe wurde auch nicht transparent, obwohl die richtige Farbe angezeigt wurde.

Jede weitere Ratschläge, wie Plots überlagern/vergleichen imshow viel

+1

Warum Sie die Subtraktion der beiden Bilddatensätze nicht zeichnen? Oder die Subtraktion einer relevanten Transformation, etwa die Umwandlung in eine Dezibel-Skala. – ely

+0

Bisher habe ich mit dieser Methode keine sehr guten Ergebnisse erzielt, aber ich versuche es weiterhin, während ich hoffe, dass jemand weiß, wie man die individuelle Farbtransparenz zur Arbeit bringt – Anake

Antwort

27

geschätzt würde Sie das alpha Argument in Ihrem imshow Befehl einstellen.

In Ihrem Beispiel img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower', alpha=0.6)

EDIT:

Danke für die Aufklärung. Hier ist eine Beschreibung dessen, was Sie tun können:

  • Zuerst wählen Sie ein matplotlib colormap Objekt (in Ihrem Fall für weiß und schwarz, können Sie die Binärdienst colormap dauern kann). Oder erstellen Sie Ihre eigene Colormap wie zuvor, wenn die gewünschte Colormap nicht bereits existiert.
  • Dann initialisieren Sie dieses Colormap-Objekt: Dadurch wird intern ein Array namens "_lut" erstellt, das rgba-Werte enthält.
  • Dann können Sie die Alpha-Werte füllen nach dem, was Sie erreichen wollen (in Ihrem Beispiel, erstellen Sie ein Array von 0 bis 0,8)
  • Sie können dann diese colormap verwenden

Unten ist ein Beispiel mit Ihrem Code:

from matplotlib.colors import colorConverter 
import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib as mpl 

# create dummy data 
zvals = np.ones((100,100))# np.random.rand(100,100)*10-5 
zvals2 = np.random.rand(100,100)*10-5 

# generate the colors for your colormap 
color1 = colorConverter.to_rgba('white') 
color2 = colorConverter.to_rgba('black') 

# make the colormaps 
cmap1 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap',['green','blue'],256) 
cmap2 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap2',[color1,color2],256) 

cmap2._init() # create the _lut array, with rgba values 

# create your alpha array and fill the colormap with them. 
# here it is progressive, but you can create whathever you want 
alphas = np.linspace(0, 0.8, cmap2.N+3) 
cmap2._lut[:,-1] = alphas 

img2 = plt.imshow(zvals, interpolation='nearest', cmap=cmap1, origin='lower') 
img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower') 

plt.show() 

image

+2

Sorry ich war nicht klar, ich hätte speziell gerne eine sehr niedrigerer Alpha-Wert für die Werte, die näher bei 0 liegen, so dass der Hintergrund die Farbe der darunter liegenden Zeichnung nicht abdeckt. Habe entsprechend bearbeitet – Anake

+0

Ich habe meine Antwort im Lichte dieser Klarstellung bearbeitet. – gcalmettes

+0

+1 für Bearbeitung hinzufügen. Es scheint, dass LinearSegmentedColormap usw. für Alpha-Werte nicht funktioniert, und Ihre ist ein guter Workaround. – tom10

Verwandte Themen