2012-04-12 10 views
18

Vorrei confrontare due diversi set di dati sulla stessa trama di presentazione per rendere più semplice la visualizzazione delle differenze. Il mio primo istinto è quello di rendere i colori nella mappa colore trasparente (i valori più bassi in particolare), ma non sono stato in grado di ottenere questo lavoro:Sovrapposizione di diagrammi implog 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() 

non ci sono errori, ma il bianco e il nero della il secondo grafico non mostra alcuna trasparenza. Ho anche provato il metodo colorConverter per impostare il colore in una normale situazione plt.plot e anche il colore non diventava trasparente anche se veniva visualizzato il colore corretto.

Qualsiasi ulteriori consigli su come sovrapporre/confrontare imshow trame sarebbe molto apprezzato

+1

Perché non tracciare la sottrazione dei due insiemi di dati di immagine? O la sottrazione di una trasformazione rilevante, come convertirli in una scala di decibel. – ely

+0

Finora non ho ottenuto ottimi risultati con questo metodo, ma continuo a provare mentre spero che qualcuno sappia come far funzionare la trasparenza dei singoli colori – Anake

risposta

27

È possibile impostare l'argomento alpha nel comando imshow.

Nel tuo esempio, img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower', alpha=0.6)

EDIT:

Grazie per il chiarimento. Ecco una descrizione di ciò che si può fare:

  • In primo luogo, scegliere un oggetto matplotlib colormap (nel tuo caso, per il bianco e nero, si può prendere il colormap 'binario'). Oppure crea la tua mappa dei colori come hai fatto, se la mappa dei colori che vuoi non esiste già.
  • Quindi inizializza questo oggetto colormap: questo lo farà creare internamente un array chiamato "_lut" che contiene i valori di rgba.
  • Quindi, è possibile riempire i valori alfa in base a ciò che si vuole raggiungere (nel tuo esempio, creare una matrice 0-0,8)
  • È quindi possibile utilizzare questo colormap

Di seguito è riportato un esempio utilizzando il codice:

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

Scusa se non ero chiaro, mi piacerebbe in particolare avere un valore alfa basso per i valori più vicini a 0 in modo che lo sfondo non copra il colore della trama sottostante. Ho modificato di conseguenza – Anake

+0

Ho modificato la mia risposta alla luce di questo chiarimento. – gcalmettes

+0

+1 per l'aggiunta di modifica. Sembra che LinearSegmentedColormap, ecc non funzioni per i valori alfa e il tuo è un buon work-around. – tom10

Problemi correlati