2015-09-11 3 views
10

Я хотел бы создать свой собственный пользовательский цвет карты в питона, я посмотрел на некоторые из онлайн примеров и выяснили следующие команды:Пользовательские Colormap в Python

from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.colors import LinearSegmentedColormap 

cdict1 = {'red': ((0.0, 0.0, 0.0), 
        (0.5, 0.0, 0.1), 
        (1.0, 1.0, 1.0)), 

     'green': ((0.0, 0.0, 0.0), 
        (1.0, 0.0, 0.0)), 

     'blue': ((0.0, 0.0, 1.0), 
        (0.5, 0.1, 0.0), 
        (1.0, 0.0, 0.0)) 
     } 

blue_red1 = LinearSegmentedColormap('BlueRed1', cdict1) 
plt.imshow(big,interpolation='nearest', cmap=blue_red1, aspect='auto') 
plt.colorbar() 
plt.show() 

С выше команды я получаю цветную карту, которая (красный - черный - синий), где красный - максимальный, а синий - минимальный. Я хотел бы создать цветную карту, которая (черный - белый - черный). Может ли кто-нибудь сказать мне, что нужно делать или какой-либо другой метод?

ответ

4

Вы хотите, чтобы все три компонента были равны 0 на 0 и 1, а все три равны 1 на 0,5. Итак, у вас есть:

cdict1 = {'red': ((0.0, 0.0, 0.0), # <- at 0.0, the red component is 0 
        (0.5, 1.0, 1.0), # <- at 0.5, the red component is 1 
        (1.0, 0.0, 0.0)), # <- at 1.0, the red component is 0 

     'green': ((0.0, 0.0, 0.0), # <- etc. 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)), 

     'blue': ((0.0, 0.0, 0.0), 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)) 
     } 

enter image description here

2

Я также нашел создание Colormap в заблуждение. LinearSegmentedColormap хорошенький, потому что он очень гибкий, но cdict использует привыкание.

Первая - и, возможно, самая важная вещь для создания цветовых паттернов таким образом, что вы понимаете, что вы понимаете RGB colors. В принципе, каждый цвет имеет значение интенсивности от 0 до 1, а более высокие значения дают больше этого цвета. В цветовом пространстве RGB белый представлен всеми тремя цветами: 1, а черный - тремя цветами 0.

Вторая вещь, которая важна для обучения созданию цветовых паттернов таким образом: всегда делайте 2-е и 3-е значения каждого кортежа одинаковым, пока не получите удобство создания простых линейных цветовых палитр. В конце концов вы можете изменить эти значения, чтобы сделать разрывы в цветовых каталогах, но это только смутит вас, когда вы начнете.

ОК, поэтому первое значение в каждом кортеже - это «фракция» цветовой карты, и они должны идти от 0 до 1, второе и третье значения - интенсивность для этого цвета (нижняя и верхняя границы). Таким образом, чтобы сделать цветовую палитру, которая является 'черно-белый-черный', вы могли бы сделать:

cdict1 = { 
    'red': ((0.0, 0.0, 0.0), 
       (0.5, 1.0, 1.0), 
       (1.0, 0.0, 0.0)), 

    'green': ((0.0, 0.0, 0.0), 
       (0.5, 1.0, 1.0), 
       (1.0, 0.0, 0.0)), 

    'blue': ((0.0, 0.0, 0.0), 
       (0.5, 1.0, 1.0), 
       (1.0, 0.0, 0.0)), 
     } 

black_white_black = LinearSegmentedColormap('BlackWhiteBlack', cdict1) 

Например,

plt.imshow(np.arange(100).reshape(10,10), cmap=black_white_black, aspect='auto') 
plt.colorbar() 

Example Image

удачи!

1

Попробуйте cdict1 из

cdict1 = {'red': ((0.0, 0.0, 0.0), 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)), 

     'green': ((0.0, 0.0, 0.0), 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)), 

     'blue': ((0.0, 0.0, 0.0), 
        (0.5, 1.0, 1.0), 
        (1.0, 0.0, 0.0)) 
     } 

Этот словарь описывает, как цвета интерполируются, глядя друг на красно-зелено-синего компонента по отдельности. Для каждого компонента вы даете ему список 3-х кортежей (x, y0, y1), которые определяют, как интерполировать этот компонент, и каждое значение, которое вы хотите, интерполируется между двумя точками в списке.

В этом случае мы хотим начать с черного [RGB = (0,0,0)], увеличить до белого [RGB = 1,1,1] на полпути диапазона данных, а затем уменьшить назад к черному в конце.

Для каждого значения, которое нужно присвоить цвету, карта сначала преобразует это значение во фракцию входного диапазона, чтобы иметь что-то в диапазоне [0, 1]. Чтобы получить уровень красного компонента, карта будет сканировать первый элемент в каждом 3-кортеже в «красном» списке и захватить самую большую, не превышающую вашу долю. Назначенный красный уровень будет интерполирован между элементом y1 этого 3-кортежа и элементом y0 следующего 3-кортежа в зависимости от разницы в значении x.

И аналогично для синих и зеленых компонентов.

7

Для чего это стоит, есть также более простой метод.

Полная форма LinearSegmentedColormap дает вам возможность «жестких» остановок и градиентов в одной цветовой палитре, поэтому она обязательно сложна. Тем не менее, есть удобный конструктор для простых случаев, таких как то, что вы описываете.

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

cmap = LinearSegmentedColormap.from_list('mycmap', ['black', 'white', 'black']) 

fig, ax = plt.subplots() 
im = ax.imshow(np.random.random((10, 10)), cmap=cmap, interpolation='nearest') 
fig.colorbar(im) 
plt.show() 

enter image description here