以十六进制格式提取matplotlib颜色图

问题描述

您可以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):
    rgba = cmap(i)
    # rgb2hex accepts rgb or rgba
    print(matplotlib.colors.rgb2hex(rgba))

输出为:

#00004c
#0000ff
#ffffff
#ff0000
#7f0000

解决方法

我试图通过操纵此示例从matplotlib颜色图中提取离散颜色。但是,我找不到N从颜色表中提取的离散颜色。

在下面的代码中,我使用了cmap._segmentdata,但是我发现它是整个颜色图的定义。给定一个颜色图和一个整数N,如何N从颜色图中提取离散的颜色并将其导出为十六进制格式?

from pylab import *

delta = 0.01
x = arange(-3.0,3.0,delta)
y = arange(-3.0,delta)
X,Y = meshgrid(x,y)
Z1 = bivariate_normal(X,Y,1.0,0.0,0.0)
Z2 = bivariate_normal(X,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,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()