2015-09-24 3 views
1

Я использую imshow() рисовать Numpy массив 2D, так, например:Как определить цвета при использовании matplotlib.pyplot.imshow()?

my_array = [[ 2. 0. 5. 2. 5.] 
      [ 3. 2. 0. 1. 4.] 
      [ 5. 0. 5. 4. 4.] 
      [ 0. 5. 2. 3. 4.] 
      [ 0. 0. 3. 5. 2.]] 

plt.imshow(my_array, interpolation='none', vmin=0, vmax=5) 

который участки изображения:

enter image description here

То, что я хочу сделать, однако, изменить цвета , так что, например, 0 - КРАСНЫЙ, 1 - ЗЕЛЕНЫЙ, 2 - ОРАНЖЕВЫЙ, вы понимаете, что я имею в виду. Есть ли способ сделать это, и если да, то как?

Я попытался сделать это путем изменения записей в colourmap, например, так:

cmap = plt.cm.jet 
    cmaplist = [cmap(i) for i in range(cmap.N)] 
    cmaplist[0] = (1,1,1,1.0) 
    cmaplist[1] = (.1,.1,.1,1.0) 
    cmaplist[2] = (.2,.2,.2,1.0) 
    cmaplist[3] = (.3,.3,.3,1.0) 
    cmaplist[4] = (.4,.4,.4,1.0) 
    cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N) 

, но он не работает, как я ожидал, потому что 0 = первую запись в цветовой карте, но 1 ! к примеру = вторая запись в цветовой карте, и поэтому только 0 обращается diffrently:

enter image description here

+1

Вы должны были бы сделать свой собственный дискретный colourmap. См. [Этот вопрос] (http://stackoverflow.com/questions/14777066/matplotlib-discrete-colorbar). – areuexperienced

+0

@areuexperienced Я попытался использовать это, чтобы изменить colourmap, но он не работал должным образом. Например, изменение первой записи цвета на (1, 1, 1, 1.0) работает, как ожидалось; 0 в моем массиве numpy отображается как белый блок. Однако я думал, что изменение второй записи цвета будет соответствовать 1 в моем массиве numpy, но это не так. Поэтому их изменение не влияет на цвет; 1-5 остались одного цвета. – Esoemah

ответ

3

Я думаю, что самый простой способ заключается в использовании ListedColormap, и, возможно, с BoundaryNorm определить bins. Учитывая ваш массив выше:

import matplotlib.pyplot as plt 
import matplotlib as mpl 

colors = ['red', 'green', 'orange', 'blue', 'yellow', 'purple'] 
bounds = [0,1,2,3,4,5,6] 

cmap = mpl.colors.ListedColormap(colors) 
norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 

plt.imshow(my_array, interpolation='none', cmap=cmap, norm=norm) 

Поскольку ваши значения данных на карте 1-на-1 с границами цветов, normalizer является излишним. Но я включил его, чтобы показать, как его можно использовать. Например, если вы хотите, чтобы значения 0,1,2 были красными, 3,4,5 зеленых и т. Д., Вы определяли границы как [0,3,6 ...].

enter image description here

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