2012-04-12 2 views
18

Я хотел бы сравнить два разных набора данных на одном и том же участке imshow, чтобы было легко увидеть различия. Мой первый инстинкт должен сделать цвета в палитре прозрачной (нижние значения особенно), но я не смог получить эту работу:Наложение графиков imshow в 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() 

Там нет ошибки, но белый и черный из второй график не показывает прозрачности. Я также попробовал метод colorConverter, чтобы установить цвет в обычной ситуации plt.plot, и цвет также не стал прозрачным, хотя был отображен правильный цвет.

Любые дополнительные советы о том, как наложение/сравнить imshow участки были бы оценены

+1

Почему вы не построить вычитание двух наборов данных изображения? Или вычитание соответствующего преобразования, например, преобразование их в шкалу децибел. – ely

+0

До сих пор я не получил очень хорошие результаты с помощью этого метода, но я продолжаю надеяться, что кто-то знает, как получить индивидуальную прозрачность цвета для работы – Anake

ответ

27

Вы можете установить alpha аргумент в вашей команде imshow.

В вашем примере, img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower', alpha=0.6)

EDIT:

Спасибо за разъяснения. Вот описание того, что вы можете сделать:

  • Сначала выберите matplotlib colormap объект (в вашем случае, белые и черные, вы можете взять «двоичную» палитру). Или создайте свою собственную цветовую карту, как и вы, если цветовая палитра, которую вы хотите, еще не существует.
  • Затем инициализируйте этот объект colormap: это заставит его внутренне создать массив с именем «_lut», который содержит значения rgba.
  • Затем вы можете заполнить значения альфа в соответствии с тем, что вы хотите достичь (в вашем примере, создать массив от 0 до 0,8)
  • Вы можете использовать эту палитру

Ниже приведен пример используя код:

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

Жаль, что я не был ясен, мне бы хотелось, чтобы низкое значение альфа для значений, близких к 0, так что фон не покрывает цвет графика ниже. Редактировал соответственно – Anake

+0

Я отредактировал свой ответ в свете этого разъяснения. – gcalmettes

+0

+1 для редактирования добавления. Кажется, что LinearSegmentedColormap и т. Д. Не работают для альфа-значений, а ваш - хорошая работа. – tom10

Смежные вопросы