Создание пользовательской карты цветов в Python matplotlib

Вот мой вопрос.

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

CMAP = ["summer_r", "brg_r", "Dark2", "prism", "PuOr_r", "afmhot_r", "terrain_r", "PuBuGn_r", "RdPu", \
        "gist_ncar_r", "gist_yarg_r", "Dark2_r", "YlGnBu", "RdYlBu", "hot_r"]
## value was a 3-d array, the first dimension represent the amount of 2-d array with the value (0, 1).     
## I just plot the value 1 for each value[i,:,:]
for i in range(0,len(CMAP),1):
    plt.pcolor(xx,yy,value[i,:,:], cmap = CMAP[i])      

И я могу получить это:

http://i8.tietuku.com/cdcdcd5f539c124b.png

Но я не могу четко представить цвет каждой сетки перед созданием рисунка.
Потому что некоторые карты цветов, которые я добавляю в CMAP, могут иметь один и тот же начальный цвет. ТАК, некоторые сетки значений [ i, :, :] будет трудно различить.

Моя идея

Вместо этого используйте одну цветовую карту и разделите ее на один цвет для каждого значения [i, :, :]. Таким образом, каждая сетка значений имеет свой цвет.

Например:

## 1. cut the colormap, take "jet" for example      
cMap = plt.cm.get_cmap("jet",lut=6)      

http://i4.tietuku.com/be127c44e87a03fc.png

## 2. I havn't figured it out     
## This is the fake code 
CMAP = Func[one color -> colormap](cMap)    

Обновление -2016-01-18

Это мой код для установки разных cmap и циклов, но он был немного жестким.

cmap1 = colors.ListedColormap(["w",'red'])
cmap2 = colors.ListedColormap(["w",'blue'])
cmap3 = colors.ListedColormap(["w",'yellow'])    

CMAP = [cmap1,cmap2,cmap3] 

Тогда я смогу справиться с моей первоначальной попыткой.

Но мне было интересно, есть ли умный способ сгенерировать cmap1, cmap2, ......?


person Han Zhengzu    schedule 17.01.2016    source источник
comment
Я думаю, что название этого вопроса должно измениться...   -  person rudolfbyker    schedule 06.04.2018
comment
Спасибо за ваш ответ. Я изменю его прямо сейчас.   -  person Han Zhengzu    schedule 06.04.2018


Ответы (1)


Самое сложное — это придумать N отличительные цвета. На практике обычно проще всего брать случайные цвета, если N мало. Если вы предпочитаете более приятный способ получения N различных цветов, посмотрите, как реализованы husl_palette и hsl_palette в seaborn. Они выбирают N равномерно расположенных цветов в пространстве HSL/HUSL и преобразуют их обратно в RGB.

В любом случае, привязка определенных значений к определенным цветам в matplotlib состоит из двух частей. Один - цветовая карта, а другой - норма. Экземпляр Normalize (норма) обрабатывает преобразование диапазонов данных в пространство 0-1 для палитры.

Есть функция, которая упрощает этот вариант использования:matplotlib.colors.from_levels_and_colors. Он возвращает экземпляры cmap и norm, которые вы можете передать в imshow/pcolormesh/scatter/и т. д.

В качестве отдельного примера давайте сгенерируем данные со случайным количеством уникальных целочисленных значений. Мы будем использовать случайные пастельные тона вместо того, чтобы пытаться сделать что-то необычное.

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

nvals = np.random.randint(2, 20)
data = np.random.randint(0, nvals, (10, 10))

colors = np.random.random((nvals, 3))
# Make the colors pastels...
colors = colors / 2.5 + 0.55

levels = np.arange(nvals + 1) - 0.5
cmap, norm = from_levels_and_colors(levels, colors)

fig, ax = plt.subplots()
im = ax.imshow(data, interpolation='nearest', cmap=cmap, norm=norm)
fig.colorbar(im, ticks=np.arange(nvals))
plt.show()

введите здесь описание изображения

Не самая красивая цветовая палитра, но это не страшно. Вот еще один прогон:

введите здесь описание изображения

Даже с 17 значениями мы все еще получаем довольно разные цвета, выбирая случайные значения.

person Joe Kington    schedule 19.01.2016