2013-12-09 2 views
2

Я пытаюсь создать пользовательскую цветовую карту, которая объединяет интерполированные и дискретизированные цветовые сегменты. Надеюсь, что такая функциональность может обеспечить LinearSegmentedColormap matplotlib. Мой тестовый пример состоял в том, чтобы создать матрицу 10x10, где строка 0 заполнена 0, строка с 1 и т. Д. Затем я пытаюсь создать цветовую карту, которая интерполируется от черного до синего, затем дискретно разрезается на красный, а затем интерполируется с красного до белого. Ожидаемый дискретный переход от синего к красному не является дискретным и вместо этого демонстрирует неожиданную интерполяцию.Неожиданная интерполяция при использовании LinearSegmentedColormap

import matplotlib.pyplot as plt 
import matplotlib as m 
import numpy as np 

mat = np.ndarray((10,10)) 
for i in xrange(10): 
    mat[i] = i 

colors = ['black', 'blue', 'red', 'white'] 
index = [0.0, 0.5, 0.5, 1.0] 

indx_clr = zip(index, colors) 
cm = m.colors.LinearSegmentedColormap.from_list('blue_red', indx_clr, 256) 

plt.imshow(mat, cmap=cm) 
plt.show() 

Неожиданная интерполяция показана ниже, благодаря пробегу.

enter image description here

У меня есть 2 вопроса.

  1. Почему синяя область интерполирована в красный регион?
  2. Как создать цветную карту, которая сочетает в себе отдельные и интерполированные цветовые сегменты?

ответ

2

Это происходит потому, что интерполяция по умолчанию imshow является билинейной. Установив его на 'none', возможно, цвета появятся так, как вы ожидаете.

Так добавить:

plt.imshow(mat, cmap=cm, interpolation='none') 

Тогда это будет выглядеть следующим образом:

enter image description here

Если увеличить размер матрицы вы заметите, что грань между красным и синим дискретно, как ожидается, пока остальная часть будет интерполирована:

enter image description here

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