Как построить цветовую карту в Seaborn из списка цветов RGB? - PullRequest
1 голос
/ 09 января 2020

Я хотел бы начать со списка цветов RGB, и из них составить карту цветов, которую я могу использовать на графиках seaborn. Я нашел несколько инструкций о том, как изменить цветовую карту по умолчанию, но это не то, что я ищу. Я хотел бы создать карту цветов, которую можно использовать в аргументе cmap, например, команды kdeplot.

1 Ответ

2 голосов
/ 11 января 2020

Построение matplotlib.colors.ListedColormap из списка цветов довольно тривиально. Вот пример использования первых 4 цветов в таблице 20 цветовой палитры -

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

# Tableau 20 color palette for demonstration
colors = [(31, 119, 180), (174, 199, 232), (255, 127, 14), (255, 187, 120)]
# Conversion to [0.0 - 1.0] from [0.0 - 255.0]
colors = [(e[0] / 255.0, e[1] / 255.0, e[2] / 255.0) for e in colors]

cmap = ListedColormap(colors)

a = np.outer(np.linspace(0, 1, 20), np.linspace(0, 1, 20))
im = plt.imshow(a, cmap=cmap)
plt.colorbar(im)
plt.show()

enter image description here

Однако, если у вас еще нет градиент в списке цветов (как это не указано выше), тогда может быть более полезным использовать вместо него matplotlib.colors.LinearSegmentedColormap. Это немного сложнее из-за ожидаемого формата, аргумент

[...] segmentdata представляет собой словарь с набором красных, зеленых и синих записей. Каждая запись должна представлять собой список из x , y0 , y1 кортежей, образующих строки в таблице [...].
Каждая строка в Таблица для данного цвета представляет собой последовательность кортежей x , y0 , y1 . В каждой последовательности x должно монотонно увеличиваться от 0 до 1. Для любого входного значения z , находящегося между x[i] и x[i+1], выходное значение данного цвета будет линейно с интерполяцией между y1[i] и y0[i+1]

Такой словарь может быть сгенерирован алгоритмически с помощью метода в примере ниже

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

# Tableau 20 color palette for demonstration
colors = [(31, 119, 180), (174, 199, 232), (255, 127, 14), (255, 187, 120)]
colors = [(e[0] / 255.0, e[1] / 255.0, e[2] / 255.0) for e in colors]

nc = len(colors)
c = np.zeros((3, nc, 3))
rgb = ['red', 'green', 'blue']
for idx, e in enumerate(colors):
    for ii in range(3):
        c[ii, idx, :] = [float(idx) / float(nc - 1), e[ii], e[ii]]

cdict = dict(zip(rgb, c))
cmap = LinearSegmentedColormap('tab20', cdict)

a = np.outer(np.linspace(0, 1, 20), np.linspace(0, 1, 20))
im = plt.imshow(a, cmap=cmap)
plt.colorbar(im)
plt.show()

enter image description here

При условии, что список ввода colors имеет правильный формат RGB.

...