2015-11-08 24 views
8

this exampleを操作して、matplotlibカラーマップから個別の色を抽出しようとしています。しかし、カラーマップから抽出された個別の色はNです。matplotlibカラーマップを16進形式で抽出します

私は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() 

答えて

14

あなたはcmap(i)を呼び出すことにより、インデックスiとセグメントのRGBA値のタプルを取得することができます。また、すでにrgb値を16進数に変換する関数もあります。ジョーキングトンがコメントに書いたように、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 
関連する問題