2017-03-16 124 views
0

これはしばらく私を悩ませています。 cmap.set_under()またはcmap.set_over()メソッドを使用して範囲外の値の色を変更すると、そのカラーマップを使用するすべてのインスタンスにこれらの変更が適用されるようです。以下は、私が言及しているものの例です。'set_under'または 'set_over'を使用した後のデフォルトのmatplotlibカラーマップ値をリセットします

import matplotlib.pyplot as plt 
import numpy as np 

rand_data = np.random.randint(50, size=(20,20)) 

plt.figure() 
plt.subplot(211) 
cmap1 = plt.cm.rainbow 
im1 = plt.pcolormesh(rand_data, cmap=cmap1, vmin=10) 
im1.cmap.set_under('w') 
plt.colorbar(extend='min') 

plt.subplot(212) 
cmap2 = plt.cm.rainbow 
im2 = plt.pcolormesh(rand_data, cmap=cmap2, vmin=10) 
im2.cmap.set_under('k') 
plt.colorbar(extend='min') 

plt.show() 

ここでは、同じ値の2つのプロットを作成しようとしています。最初のプロットでは、10未満のすべての値を白にします。 2番目のプロットでは、10未満のすべての値を黒にします。私がset_underを使用し二回目は、それが虹のカラーマップを使用するすべての既存のプロットのset_underをリセットすることが表示されます

:結果がこれです。私は2番目のプロットに異なるカラーマップを使用している場合は、私は可能な異なるset_under色を設定します

enter image description here

さらに奇妙な、関数やスクリプトで使用cmap.set_under()またはcmap.set_over()場合、この設定は後にリセットされません。その機能を終了する。つまり、私が明示的にset_underを定義した行をコメントアウトして、色がスクリプトを再実行すると、前と同じ結果になります。

  1. は、既存のプロットのカラーマップに影響を与えることなく、単一のプロットのためのカラーマップの範囲外の値の色を設定する方法はあります:

    は、だから私は、カップルの質問があります?

  2. アウトオブバウンド値を元の色にリセットするにはどうすればよいですか? 2番目の質問については

は、私は手動でこのような何かを行うことによって、元の色に戻って追加することができます知っている:

N = cmap.N 
cmap.set_under(cmap(1)) 
cmap.set_over(cmap(N-1)) 

しかし、もっと簡単な方法があるはずような気がします。

答えて

1

あなたが記述している動作は予期されています。 1つのカラーマップしかありません。これはplt.cm.rainbowです。最初にset_under('w')とそれ以降のset_under('k')を入力すると、underの色は黒になります。

実際には、同じカラーマップの2つの異なるインスタンスを使用し、それぞれのインスタンスを下限の異なる値に変更します。
これは簡単に今cmap1が、後での別のコピーを作成し、異なる設定を適用することが可能であるように、自分自身のカラーマップ虹を変更しない操作copy

cmap1 = copy.copy(plt.cm.rainbow) 

を使用して行うことができます。

import matplotlib.pyplot as plt 
import numpy as np 
import copy 

rand_data = np.random.randint(50, size=(20,20)) 

plt.figure() 
plt.subplot(211) 
cmap1 = copy.copy(plt.cm.rainbow) 
im1 = plt.pcolormesh(rand_data, cmap=cmap1, vmin=10) 
im1.cmap.set_under('w') 
plt.colorbar(extend='min') 

plt.subplot(212) 
cmap2 = copy.copy(plt.cm.rainbow) 
im2 = plt.pcolormesh(rand_data, cmap=cmap2, vmin=10) 
im2.cmap.set_under('k') 
plt.colorbar(extend='min') 

plt.show() 

enter image description here

+0

ありがとうございます!私はカラーマップのコピーを作ることについても考えなかった。私は 'im.cmap 'を使っている印象を受けていたと思います。set_under() 'と' cmap.set_under'との違いは、 'im'で使われているカラーマップのインスタンスだけを変更します。しかし、あなたの説明は理にかなっています。 – nikobam

関連する問題