web-dev-qa-db-fra.com

Extraire la palette de couleurs matplotlib au format hexadécimal

J'essaie d'extraire des couleurs discrètes d'une palette de couleurs matplotlib en manipulant cet exemple . Cependant, je ne trouve pas les couleurs discrètes N qui sont extraites de la palette de couleurs.

Dans le code ci-dessous, j'ai utilisé cmap._segmentdata, mais j'ai trouvé que c'était la définition de la palette de couleurs entière. Étant donné une palette de couleurs et un entier N, comment extraire N des couleurs discrètes de la palette de couleurs et les exporter au format hexadécimal?

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()
24
pir

Vous pouvez obtenir un Tuple de valeurs rgba pour le segment d'index i en appelant cmap(i). Il existe également déjà une fonction qui transforme les valeurs RVB en hexadécimal. Comme Joe Kington l'a écrit dans les commentaires, vous pouvez utiliser matplotlib.colors.rgb2hex. Par conséquent, une solution possible serait:

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))

La sortie est:

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