Создайте палитру, которая назначается определенным целочисленным значениям с помощью numpy/scipy

Я ищу способ создать цветовую карту в python/matplotlib, которая относится к назначенному целочисленному значению и остается этим целочисленным значением. Вот пример того, как я определяю карту цветов Matlab:

c_map = [1   1   1;...     % Integer assignment = 0 - Air - white
         0.6 1 0.8;... % Integer assignment = 1 - Water - cyan
         1 0.6 0.2];   % Integer assignment = 2 - Sediments - orange

позже он вызывается во время процедуры построения графика:

colormap(c_map);
pcolor(xvec,zvec,ColorIntegers);
shading interp, colormap, caxis([0 3]), axis ij

Целочисленные значения всегда остаются неизменными (т. е. воздух = 0, вода = 1, отложения = 2).

Я просмотрел документацию и стек matplotlib, но не нашел способа создать эту цветовую карту определенного стиля, которая связывает соответствующие целые числа с цветом. Большинство вопросов касаются расходящихся, струйных, центрирующих, линейных, нелинейных, а не последовательной окраски конкретных цветовых карт. Каждый цвет должен соответствовать этому конкретному целочисленному значению.

Любая помощь будет оценена, спасибо заранее.


person squarerootnegative1    schedule 27.09.2015    source источник
comment
Можно ли настроить его как карту 0, 1, 2, ... во время построения? mapping.index(material) или что-то в этом роде. Не очень хороший хак, но все же.   -  person Jean Nassar    schedule 27.09.2015
comment
Привет Жан, спасибо за ваш комментарий и очень ценю его. Ответ ниже работал отлично. Поскольку я не гуру Python, это показалось мне наиболее удобным. Еще раз спасибо за ваш комментарий.   -  person squarerootnegative1    schedule 27.09.2015
comment
Все нормально. Я думал, что y равно array([["water", "water", "sediment", ...]]), и вы хотели преобразовать его в целые числа. mapping может быть списком (["air", "water", "sediment", "rock"]) или словарем ({"air": 0, "water": 1, "sediment": 2, "rock": 3}). Использование mapping.index(material) для списка или mapping[material] для словаря позволит вам автоматически преобразовать его в числа для рисования.   -  person Jean Nassar    schedule 27.09.2015
comment
Не волнуйтесь! Это здорово знать об использовании списков. Видимо, мне есть чему поучиться. Я ценю ваш совет.   -  person squarerootnegative1    schedule 27.09.2015


Ответы (1)


Взгляните на ListedColormap.

Например,

In [103]: y
Out[103]: 
array([[1, 1, 2, 2, 2, 1, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1],
       [1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
       [1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0],
       [1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 0],
       [1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 0],
       [1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 3, 3, 2, 1, 0],
       [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1],
       [1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, 1],
       [1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1],
       [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1],
       [0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 2],
       [0, 1, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 2, 2],
       [1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2],
       [2, 1, 1, 0, 0, 1, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1],
       [2, 1, 1, 0, 1, 2, 2, 3, 3, 3, 3, 2, 1, 1, 1, 1],
       [2, 1, 1, 0, 2, 3, 3, 3, 3, 3, 2, 1, 0, 1, 1, 0]])

In [104]: c_map = [[1, 1, 1], [0.6, 1, 0.8], [1, 0.6, 0.2], [0.75, 0.25, 0.25]]

In [105]: cm = matplotlib.colors.ListedColormap(c_map)

In [106]: imshow(y, interpolation='nearest', cmap=cm)

генерирует

изображение

person Warren Weckesser    schedule 27.09.2015