2013-04-22 3 views
3

Я использую colormap в python для построения и анализа значений в матрице. Мне нужно связать белый цвет с каждым элементом, равным 0,0, тогда как для других я хотел бы иметь «традиционную» цветовую карту. Глядя на Python Matplotlib Colormap Я изменил словарь, используемый pcolor как:Matplotlib python change single color in colormap

dic = {'red': ((0., 1, 1), 
       (0.00000000001, 0, 0), 
       (0.66, 1, 1), 
       (0.89,1, 1), 
       (1, 0.5, 0.5)), 
     'green': ((0., 1, 1), 
       (0.00000000001, 0, 0), 
       (0.375,1, 1), 
       (0.64,1, 1), 
       (0.91,0,0), 
       (1, 0, 0)), 
     'blue': ((0., 1, 1), 
       (0.00000000001, 1, 1), 
       (0.34, 1, 1), 
       (0.65,0, 0), 
       (1, 0, 0))} 

В результате получается: enter image description here

Я установил:

matrix[0][0]=0 matrix[0][1]=0.002 

Но как вы можете видеть, что они оба связаны с белым цвет, даже если я установил 0,00000000001 в качестве отправной точки для синего. Как это возможно? Как я могу изменить его, чтобы получить то, что мне хотелось?

ответ

2

Хотя это и не идеально, работает маскировка нулевого значения. Вы можете управлять отображением его с помощью cmap.set_bad().

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

dic = {'red': ((0., 1, 0), 
       (0.66, 1, 1), 
       (0.89,1, 1), 
       (1, 0.5, 0.5)), 
     'green': ((0., 1, 0), 
       (0.375,1, 1), 
       (0.64,1, 1), 
       (0.91,0,0), 
       (1, 0, 0)), 
     'blue': ((0., 1, 1), 
       (0.34, 1, 1), 
       (0.65,0, 0), 
       (1, 0, 0))} 

a = np.random.rand(10,10) 
a[0,:2] = 0 
a[0,2:4] = 0.0001 

fig, ax = plt.subplots(1,1, figsize=(6,6)) 

cmap = LinearSegmentedColormap('custom_cmap', dic) 
cmap.set_bad('white') 

ax.imshow(np.ma.masked_values(a, 0), interpolation='none', cmap=cmap) 

enter image description here

+0

Может сказать мне, где вы установите опцию «разрывы»? Является ли интерполяция = 'none'? –

+0

Его в вашем колормоне. У диктатора есть формат (x, y1, y2), обратите внимание, что для ваших y1 и y2 равны и мои изменения. В этом случае с моей цветовой палитрой это означает, что значения _till_ zero имеют цвет 1 для rgb (так белый), но значения _from_ zero имеют 0 для красного и зеленого цветов и 1 для синего (синий). См.: http://matplotlib.org/api/colors_api.html#matplotlib.colors.LinearSegmentedColormap –

+0

Но если я определяю словарь так же, как и вы, мне также нужно использовать: np.ma.masked_values ​​(matrix, 0) как параметр imshow(), иначе «трюк» не работает. –