2012-04-12 18 views
18

Me gustaría comparar dos conjuntos diferentes de datos en el mismo diagrama de imshow para que sea más fácil ver las diferencias. Mi primer instinto es hacer que los colores en el mapa de color transparente (los valores más bajos en especial), pero no he sido capaz de conseguir que esto funcione:Superposición de diagramas de imshow en 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() 

no hay ningún error, pero el blanco y negro de la segundo gráfico no muestra ninguna transparencia. También probé el método colorConverter para establecer el color en una situación plt.plot normal y el color tampoco se volvió transparente aunque se mostró el color correcto.

Cualquier consejo adicional sobre cómo superponer/comparar imshow parcelas sería apreciada mucho

+1

¿Por qué no trazar la resta de los dos conjuntos de datos de imagen? O la resta de una transformación relevante, como convertirlos a una escala de decibelios. – ely

+0

Hasta ahora no he obtenido muy buenos resultados con este método, pero sigo intentando mientras espero que alguien sepa cómo hacer que funcione la transparencia del color individual – Anake

Respuesta

27

Puede establecer el argumento alpha en su comando imshow.

En su ejemplo, img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower', alpha=0.6)

EDIT:

Gracias por la aclaración. Aquí es una descripción de lo que puede hacer:

  • primer lugar, elegir un objeto matplotlib colormap (en su caso, de blanco y negro, se puede tomar el mapa de colores 'binario'). O cree su propio mapa de colores como lo hizo, si el mapa de colores que desea no existe.
  • A continuación, inicialice este objeto de mapa de color: esto hará que cree internamente una matriz llamada "_lut" que contiene los valores de rgba.
  • A continuación, puede rellenar los valores alfa de acuerdo a lo que quiere lograr (en su ejemplo, crear una matriz de 0 a 0,8)
  • A continuación, puede utilizar este mapa de colores

A continuación se muestra un ejemplo utilizando su código:

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

Lo siento, no estaba claro, específicamente me gustaría tener una muy bajo valor alfa para los valores más cercanos a 0 para que el fondo no cubra el color de la gráfica siguiente. He editado por consiguiente – Anake

+0

He editado mi respuesta a la luz de esta aclaración. – gcalmettes

+0

+1 para editar la adición. Parece que LinearSegmentedColormap, etc. no funcionan para los valores alfa, y el suyo es una buena solución. – tom10

Cuestiones relacionadas