Matplotlib python меняет один цвет в цветовой карте

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

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))}

Результат: введите описание изображения здесь

Я установил:

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

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


person Titus Pullo    schedule 22.04.2013    source источник


Ответы (1)


Хотя это и не идеально, но работает маскировка нулевого значения. Вы можете управлять его отображением с помощью 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)

введите описание изображения здесь

person Rutger Kassies    schedule 23.04.2013
comment
Подскажите, где именно вы устанавливаете опцию «разрывов»? Интерполяция = «нет»? - person Titus Pullo; 23.04.2013
comment
Это в вашем словарном ассортименте цветовой карты. Словарь имеет формат (x, y1, y2), обратите внимание, что для вашего y1 и y2 равны, а у меня - изменение. В этом случае с моей цветовой картой это означает, что значения от до нуля имеют цвет 1 для rgb (так белый), но значения from zero имеют 0 для красного и зеленого и 1 для синего (синий). См. matplotlib.org/api/ - person Rutger Kassies; 23.04.2013
comment
Но если я определю словарь, как вы, мне также нужно будет использовать: np.ma.masked_values ​​(matrix, 0) в качестве параметра imshow (), иначе трюк не сработает. - person Titus Pullo; 23.04.2013
comment
Извините, я перепутал две вещи в своем коде. Я отредактировал свой пост, подход с маскированным массивом - единственный способ заставить его работать. Игнорируйте вещи о cmap, это действительно не работает. Было бы неплохо иметь решение "только cmap". - person Rutger Kassies; 23.04.2013