web-dev-qa-db-ja.com

16進数形式でmatplotlibカラーマップを抽出する

この例 を操作して、matplotlibカラーマップから離散色を抽出しようとしています。ただし、カラーマップから抽出されたN離散色が見つかりません。

以下のコードではcmap._segmentdataを使用しましたが、カラーマップ全体の定義であることがわかりました。カラーマップと整数Nが与えられた場合、カラーマップからN離散色を抽出して16進形式でエクスポートするにはどうすればよいですか?

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

cmap(i)を呼び出すと、インデックスiのセグメントのrgba値のタプルを取得できます。 rgb値を16進数に変換する関数もすでにあります。 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))

出力は次のとおりです。

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