Извлечь цветовую карту matplotlib в шестнадцатеричном формате

Я пытаюсь извлечь дискретные цвета из карты цветов matplotlib, манипулируя этим примером . Однако я не могу найти N дискретных цветов, извлеченных из цветовой карты.

В приведенном ниже коде я использовал cmap._segmentdata, но обнаружил, что это определение всей палитры. Учитывая карту цветов и целое число N, как мне извлечь N дискретных цветов из карты цветов и экспортировать их в шестнадцатеричном формате?

from pylab import *

delta = 0.01
x = arange(-3.0, 3.0, delta)
y = arange(-3.0, 3.0, delta)
X,Y = meshgrid(x, y)
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = Z2 - Z1 # difference of Gaussians

cmap = cm.get_cmap('seismic', 5)    # PiYG
cmap_colors = cmap._segmentdata

def print_hex(r,b,g):
               if not(0 <= r <= 255 or 0 <= b <= 255 or 0 <= g <= 255):
                              raise ValueError('rgb not in range(256)')
               print '#%02x%02x%02x' % (r, b, g)


for i in range(len(cmap_colors['blue'])):
               r = int(cmap_colors['red'][i][2]*255)
               b = int(cmap_colors['blue'][i][2]*255)
               g = int(cmap_colors['green'][i][2]*255)
               print_hex(r, g, b)



im = imshow(Z, cmap=cmap, interpolation='bilinear',
            vmax=abs(Z).max(), vmin=-abs(Z).max())
axis('off')
colorbar()

show()

person pir    schedule 08.11.2015    source источник


Ответы (2)


Вы можете получить кортеж значений rgba для сегмента с индексом i, вызвав cmap(i). Также уже есть функция, которая превращает значения RGB в шестнадцатеричные. Как написал в комментариях Джо Кингтон, вы можете использовать matplotlib.colors.rgb2hex. Таким образом, возможным решением может быть:

from pylab import *

cmap = cm.get_cmap('seismic', 5)    # PiYG

for i in range(cmap.N):
    rgba = cmap(i)
    # rgb2hex accepts rgb or rgba
    print(matplotlib.colors.rgb2hex(rgba))

Результат:

#00004c
#0000ff
#ffffff
#ff0000
#7f0000
person swenzel    schedule 08.11.2015
comment
или используя понимание списка [matplotlib.colors.rgb2hex(c) для c в cmap.colors] - person alexmloveless; 09.12.2020

Для справки в будущем: мой пакет CMasher предоставляет функцию с именем take_cmap_colors() (https://cmasher.readthedocs.io/user/usage.html#taking-colormap-colors), который позволяет брать любое количество дискретных цветов из заданной палитры и возвращать их в любом формате (8-битном, нормализованном или HEX) они хотят.

Итак, если вы, например, хотите взять 5 цветов в HEX из цветовой карты viridis, вы можете сделать это с помощью:

import cmasher as cmr

colors = cmr.take_cmap_colors('viridis', 5, return_fmt='hex')

или если вам нужны все цвета в HEX из палитры в определенном диапазоне значений, вы можете сделать это с помощью:

colors = cmr.take_cmap_colors('viridis', None, cmap_range=(0.2, 0.8), return_fmt='hex')
person 1313e    schedule 12.01.2021