2016-05-13 9 views
1

Я следую за documentation для создания пользовательской цветовой карты. На карте я хочу выглядеть следующим образом:пользовательская цветовая карта для pcolor

enter image description here

Вот словарь я придумал:

cdict = {'red': ((0.00, 0.0, 0.0), 
       (0.25, 1.0, 0.0), 
       (0.50, 0.0, 0.0), 
       (0.75, 1.0, 0.0), 
       (1.00, 1.0, 0.0)), 

    'green': ((0.00, 0.0, 0.0), 
       (0.25, 1.0, 1.0), 
       (0.50, 1.0, 1.0), 
       (0.75, 1.0, 1.0), 
       (1.00, 0.0, 0.0)), 

    'blue': ((0.00, 1.0, 1.0), 
       (0.25, 0.0, 0.0), 
       (1.00, 0.0, 0.0)) 
    } 

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

Вот что остальная часть кода выглядит следующим образом:

cmap = LinearSegmentedColormap('bgr', cdict) 
plt.register_cmap(cmap=cmap) 

plt.pcolor(dist, cmap='bgr') 
plt.yticks(np.arange(0.5, len(dist.index), 1), dist.index) 
plt.xticks(np.arange(0.1, len(dist.columns), 1), dist.columns, rotation=40) 

for y in range(dist.shape[0]): 
    for x in range(dist.shape[1]): 
     plt.text(x + 0.5, y + 0.5, dist.iloc[y,x], 
       horizontalalignment='center', 
       verticalalignment='center', rotate=90 
       ) 
plt.show() 

Вот пример оказанной Тепловая карта:

enter image description here

Что мне не хватает?

ответ

1

Причина, по которой 0,5 показывает вверх как красный в вашем участке, вероятно, только потому, что ваш vmin и vmax не 0.0 и 1.0. Большинство matplotlib 2D-строчных подпрограмм устанавливают vmax в максимальное значение в массиве по умолчанию, которое выглядит как 0.53 в вашем случае. Если вы хотите, чтобы 0,5 был зеленым, установите vmin=0.0, vmax=1.0 в звонок pcolor.

Ваш Colormap ДИКТ почти правильно, но, как вы его сейчас есть жесткие переходы желтый/зеленый на 0,25 и 0,75 пункта, вы должны изменить эти строки в «красный» от

  (0.25, 1.0, 0.0), 
      (0.50, 0.0, 0.0), 
      (0.75, 1.0, 0.0), 

к

  (0.25, 1.0, 1.0), 
      (0.50, 0.0, 0.0), 
      (0.75, 1.0, 1.0), 

чтобы получить цветовую гамму, которую вы хотите. Это результат:

corrected colorscale

0

Кажется, что ваш цветной словарь неверен. Например, первая запись для начала палитры является:

'red': (0.00, 0.0, 0.0) 
'green': (0.00, 0.0, 0.0) 
'blue': (0.00, 1.0, 1.0) 

, который дает RGB = 001 = синему. Кроме того, я не уверен, как LinearSegmentedColormap будет вести себя, когда некоторые интервалы (например, индекс 0.5 в blue) не определены.

Это, кажется, дает правильные результаты:

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

pl.close('all') 

cdict = { 
    'red': ((0.00, 1.0, 1.0), 
      (0.25, 1.0, 1.0), 
      (0.50, 0.0, 0.0), 
      (0.75, 1.0, 1.0), 
      (1.00, 0.0, 0.0)), 

    'green': ((0.00, 0.0, 0.0), 
      (0.25, 1.0, 1.0), 
      (0.50, 1.0, 1.0), 
      (0.75, 1.0, 1.0), 
      (1.00, 0.0, 0.0)), 

    'blue': ((0.00, 0.0, 0.0), 
      (0.25, 0.0, 0.0), 
      (0.50, 0.0, 0.0), 
      (0.75, 0.0, 0.0), 
      (1.00, 1.0, 1.0)) 
} 

cm_rgb = LinearSegmentedColormap('bgr', cdict) 

pl.figure() 
pl.imshow(np.random.random((20,20)), interpolation='nearest', cmap=cm_rgb) 
pl.colorbar() 

См the matplotlib docs для документирования LinearSegmentedColormap.

enter image description here

+1

О, я вижу, я получил карту цветное изображение неправильно. Нет, дикт прав, просто изображение должно быть зеркальным отражением того, что было. Я только что исправил это. Проблема в том, что значения .5 отображаются в красный, а не зеленый. И ссылка docs, которую вы указали, дает понять, что записи r, g, b не нужно выравнивать. В этом примере один из компонентов цвета имеет больше интервалов, чем другие. –

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