matplotlibのimshowを使用してNaN値を特別な色としてプロットするにはどうすればよいですか?


85

matplotlibでimshowを使用してデータをヒートマップとしてプロットしようとしていますが、値の一部はNaNです。NaNをカラーマップにない特別な色としてレンダリングしたいのですが。

例:

import numpy as np
import matplotlib.pyplot as plt
f = plt.figure()
ax = f.add_subplot(111)
a = np.arange(25).reshape((5,5)).astype(float)
a[3,:] = np.nan
ax.imshow(a, interpolation='nearest')
f.canvas.draw()

結果の画像は、予期せずすべて青(ジェットカラーマップの最低色)になります。ただし、次のようにプロットを行うと、次のようになります。

ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)

-それならもっと良いものが得られますが、NaN値はvminと同じ色で描画されます... NaNを特別な色(例:灰色または透明)で描画するように設定できる優雅な方法はありますか?


数年後(matplotlib.__version__=='1.2.1')、これは問題なく動作します。
フレデリックグロシャン2014年

回答:


47

Matplotlibの新しいバージョンでは、マスクされた配列を使用する必要がなくなりました。

たとえば、7番目ごとの値がNaNである配列を生成してみましょう。

arr = np.arange(100, dtype=float).reshape(10, 10)
arr[~(arr % 7).astype(bool)] = np.nan

現在のカラーマップを変更し、次の線で配列をプロットできます。

current_cmap = matplotlib.cm.get_cmap()
current_cmap.set_bad(color='red')
plt.imshow(arr)

プロット結果


np.nanの代わりに0を使用することは可能ですか?
yukashimahuksay18年

2
@yukashimahuksay:はい。ただし、これらの値をマスクする必要があります。例えば。arr = np.ma.array(arr, mask=(arr == 0))
ArcturusB18年

私は変数「current_cmap」を呼び出すことはありませんので、「CMAP」内の「C」はすでに、「現在」の略だと思う
T.グウェン

3
@TGwen:cmapはcolormapの略で、ドキュメントで使用されている用語であると確信しています:matplotlib.org/api/cm_api.html#matplotlib.cm.get_cmap
ArcturusB19年

82

うーん、マスクされた配列を使用してこれを行うことができるようです:

masked_array = np.ma.array (a, mask=np.isnan(a))
cmap = matplotlib.cm.jet
cmap.set_bad('white',1.)
ax.imshow(masked_array, interpolation='nearest', cmap=cmap)

私はまだ提案を受け入れていますが、これで十分です。:]


それは間違いなくトリックを行います。公式ドキュメントにはこれ以上何も表示されていません。
agos

6
補足-これを行うとデフォルトが上書きされると思うmatplotlib.cm.jetので、通常はコピーを作成しますimport copy; cmap=copy.copy(matplotlib.cm.jet)。また、0の値を別の色に設定する場合は、のようなものが機能するcmap._init(); cm._lut[:,0] = (1,1,1,1)はずです。
keflavich 2013

3
範囲外の値の色付けを制御するためのもset_overありset_underます。デフォルトの動作は、色範囲の上部/下部に一致することです。
tacaswell 2014年

2
されるmasked_arrayすべてで必要?場合はa(それはのように思われるので、NaN値が含まれmask=np.isnan(a)、その後だけ、)imshowアレイ-ingaカスタマイズされた地図をcmap必要色(白)とNaNの細胞が表示されます。だからそれは私のために働きます。例外はありますか?
MaciekS 2017

2
@MaciekS、発散カラーマップを使用する場合、nan値と中央値が同じ色(白など)でプロットされることは望ましくありません。
AGS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.