2012-04-12 55 views
18

同じimshowプロットの2つの異なるデータセットを比較して、その違いを簡単に確認したいと考えています。 私の最初の本能は(特に低い値)透明カラーマップで色を作ることですが、私はこの作業を取得することができませんでした:matplotlibのオーバーレイimshowプロット

from matplotlib.colors import colorConverter 
import matplotlib.pyplot as plt 
import numpy as np 

# create dummy data 
zvals = np.random.rand(100,100)*10-5 
zvals2 = np.random.rand(100,100)*10-5 

# generate the transparent colors 
color1 = colorConverter.to_rgba('white',alpha=0.0) 
color2 = colorConverter.to_rgba('black',alpha=0.8) 

# make the colormaps 
cmap1 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap',['green','blue'],256) 
cmap2 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap2',[color1,color2],256) 

img2 = plt.imshow(zvals,interpolation='nearest',cmap=cmap1,origin='lower') 
img3 = plt.imshow(zvals2,interpolation='nearest',cmap=cmap2,origin='lower') 

plt.show() 

は誤りがないが、白と黒2番目のプロットは透明性を示さない。私はまた、通常のplt.plotの状況で色を設定するためにcolorConverterメソッドを試しましたが、正しい色が表示されたにもかかわらず色も透明になりませんでした。

関数imshowプロットを比較/オーバーレイする方法上の任意の追加のアドバイスは非常にあなたのimshowコマンドでalpha引数を設定することができます

+1

は、なぜあなたは2つの画像データセットの減算をプロットしていませんか?または、デシベルスケールに変換するなど、関連する変換の減算。 – ely

+0

これまでのところ、この方法では良い結果を得られませんでしたが、個々のカラー透明度をどのように働かせるかを知りたいと思っていましたが、引き続き努力しています – Anake

答えて

27

をいただければ幸いです。あなたの例では

img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower', alpha=0.6)

編集:明確にするため

感謝。ここ は、あなたが何ができるかの説明です:

  • まず、(あなたの場合には、白と黒のために、あなたは「バイナリ」のカラーマップを取ることができます)matplotlib colormapオブジェクトを選択します。または、必要なカラーマップが存在しない場合は、独自のカラーマップを作成します。
  • 次に、このカラーマップオブジェクトを初期化します。これにより、rgba値を保持する "_lut"という配列が内部的に作成されます。
  • その後、あなたは
  • あなたは(あなたの例では、0から0.8に配列を作成)を達成したいかに応じてアルファ値を埋めることができますが、その後

以下は、このカラーマップを使用することができます例です。あなたのコードを使用して:

from matplotlib.colors import colorConverter 
import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib as mpl 

# create dummy data 
zvals = np.ones((100,100))# np.random.rand(100,100)*10-5 
zvals2 = np.random.rand(100,100)*10-5 

# generate the colors for your colormap 
color1 = colorConverter.to_rgba('white') 
color2 = colorConverter.to_rgba('black') 

# make the colormaps 
cmap1 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap',['green','blue'],256) 
cmap2 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap2',[color1,color2],256) 

cmap2._init() # create the _lut array, with rgba values 

# create your alpha array and fill the colormap with them. 
# here it is progressive, but you can create whathever you want 
alphas = np.linspace(0, 0.8, cmap2.N+3) 
cmap2._lut[:,-1] = alphas 

img2 = plt.imshow(zvals, interpolation='nearest', cmap=cmap1, origin='lower') 
img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower') 

plt.show() 

image

+2

私は明確ではありませんでした。背景が下のプロットの色をカバーしないように、0に近い値の低いアルファ値。それに応じて編集しました – Anake

+0

私はこの解明の観点から私の答えを編集しました。編集追加の場合は – gcalmettes

+0

+1。 LinearSegmentedColormapなどはアルファ値では機能しないと思われますが、あなたは良い回避策です。 – tom10

関連する問題