6

重複の可能性:
カラー プロットとカラー バーの 2 つ (またはそれ以上) の特定の値に個別の色を追加する

値の配列があり、matplotlib で pcolor を使用してこれらをプロットしたいと思います。カラー マップ 'YlOrRd' を使用していますが、問題なく動作しますが、ゼロ以外のすべての値にカラー マップを使用したいと考えています。つまり、0 以外の値はすべてカラー マップを使用する必要があります。0 を黒にしたいと思います。

現在、値の数の多い配列「x」に使用しています。

pcolor(x,cmap=cm.YlOrRd)

配列 x 内の 0 のすべての値を任意に黒に修正する方法はありますか?

ありがとう、デイブ。

4

1 に答える 1

5

これを行うには2つの方法があります。1 つは独自の を作成する方法colormap、もう 1 つは を使用する方法masked arrayです。私たちが持っているとしましょう:

import matplotlib
from pylab import *

data = np.arange(-50, 50).reshape(10, 10)
data = np.abs(data)
pcolor(data, cmap=cm.YlOrRd)
show()

これにより、次のようになります: 同じことを行いますが、黒 ( rgb で)に設定したエントリを除いて、と同じ値を持つここに画像の説明を入力 という名前のリストを作成します。次に、実際にカラーマップを作成します。colorscm.YlOrRd00,0,0LinearSegmentedColormap.from_list

import matplotlib
from pylab import *

data = np.arange(-50, 50).reshape(10, 10)
data = np.abs(data)
colors = [(0,0,0)] + [(cm.YlOrRd(i)) for i in xrange(1,256)]
new_map = matplotlib.colors.LinearSegmentedColormap.from_list('new_map', colors, N=256)
pcolor(data, cmap=new_map)
savefig('map.png')
show()

これは同じプロットを生成しますが、ゼロ値は黒です:

ここに画像の説明を入力 これは、マスクされた配列を使用する別の方法です。もう少し複雑です。コード内のコメントで手順が説明されています。

from pylab import *
import numpy.ma as ma

data=np.arange(-50,50).reshape(10,10)
data=np.abs(data)
#create a mask where only values=0 are true:
mask = data == 0
#create a masked array by combining our mask and data:
mx = ma.masked_array(data, mask)
#set masked values in cm.YlOrRd to 'black'
cm.YlOrRd.set_bad(color='black', alpha=None)
# pcolor(data,cmap=cm.YlOrRd)
#we must use pcolormesh instead of pcolor, as pcolor does not draw masked values at all
pcolormesh(mx,cmap=cm.YlOrRd)
show()

これにより、すぐ上と同じプロットが生成されます。

これらの方法には潜在的な違いがあります。最初の方法はデータ値を切り捨てて適切な色を適用しますが、2 番目の方法は 0 に等しい値のみを黒に設定します (つまり、0.001 はマスクされないため、適切な色になります)。cm.YlOrRd色)。2 番目の主な利点は、エントリを完全に任意にマスクできることです。

于 2012-05-10T10:04:34.070 に答える