以十六进制格式提取matplotlib色彩映射

pir*_*pir 22 python hex matplotlib color-mapping colormap

我试图通过操作此示例从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()
Run Code Online (Sandbox Code Playgroud)

swe*_*zel 45

您可以i通过调用获得具有索引的段的rgba值元组cmap(i).还有一个函数可以将rgb值转换为十六进制.正如Joe Kington在评论中写道,你可以使用matplotlib.colors.rgb2hex.因此,一个可能的解决方案是:

from pylab import *

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

for i in range(cmap.N):
    rgb = cmap(i)[:3] # will return rgba, we take only first 3 so we get rgb
    print(matplotlib.colors.rgb2hex(rgb))
Run Code Online (Sandbox Code Playgroud)

输出是:

#00004c
#0000ff
#ffffff
#ff0000
#7f0000
Run Code Online (Sandbox Code Playgroud)

  • 或使用列表理解 [matplotlib.colors.rgb2hex(c) for c in cmap.colors] (5认同)

131*_*13e 6

供将来参考:我的 CMasher 包提供了一个名为take_cmap_colors()https://cmasher.readthedocs.io/user/usage.html#take-colormap-colors)的函数,它允许人们从给定的颜色图中获取任意数量的离散颜色,并且以他们想要的任何格式(8 位、标准化或十六进制)返回它们。

因此,如果您想从颜色图中获取 5 种十六进制颜色viridis,您可以使用以下命令:

import cmasher as cmr

colors = cmr.take_cmap_colors('viridis', 5, return_fmt='hex')
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要特定值范围内颜色图中的所有十六进制颜色,您可以使用以下命令来实现:

colors = cmr.take_cmap_colors('viridis', None, cmap_range=(0.2, 0.8), return_fmt='hex')
Run Code Online (Sandbox Code Playgroud)