2013-02-08 110 views
46

私はmatplotlibのmatplotlibの離散カラーバー

で散布のための個別のカラーバーを作成しようとしています、私は私のx、yのデータと私はユニークな色で表現することにしたい各点の整数タグ値、例えばを持っています

plt.scatter(x, y, c=tag) 

典型的にはタグは0~20の範囲の整数であるが、正確な範囲は、これまでのところ、私は、例えば、デフォルト設定を単に使用している

を変更することができます

plt.colorbar() 

これは、連続的な色の範囲を示します。理想的には、n個の離散色のセットが必要です(この例ではn = 20)。タグの値を0にして灰色を作り、1〜20をカラフルにすることがさらに良いでしょう。

は、私はいくつかの「料理」スクリプトを発見したが、彼らは非常に複雑であり、私は彼らがあなたがこのexample従うことができる

+1

は、[この](http://matplotlib.org/examples/api/colorbar_only.html)または[この]ありません(http://www.scipy.org/Cookbook/Matplotlib/ColormapTransformations)ヘルプ? –

+0

リンクのおかげさしですが、2番目の例は、(一見)些細な作業を実行するためには非常に複雑すぎるということです - 最初のリンクは便利です – bph

答えて

58

BoundaryNormを散布図のノーマライザーとして使用すると、非常に簡単にカスタムの個別カラーバーを作成できます。奇妙なビット(私の方法で)灰色として0ショーをしています。

私はしばしばcmap.set_bad()を使い、データをマスクされた配列に変換します。それは0グレーを作る方がはるかに簡単ですが、私はこれを散布機またはカスタムcmapで動作させることができませんでした。

別の方法として、独自のcmapを作成したり、既存のものを読み込んで、特定のエントリだけを上書きすることができます。

# setup the plot 
fig, ax = plt.subplots(1,1, figsize=(6,6)) 

# define the data 
x = np.random.rand(20) 
y = np.random.rand(20) 
tag = np.random.randint(0,20,20) 
tag[10:12] = 0 # make sure there are some 0 values to showup as grey 

# define the colormap 
cmap = plt.cm.jet 
# extract all colors from the .jet map 
cmaplist = [cmap(i) for i in range(cmap.N)] 
# force the first color entry to be grey 
cmaplist[0] = (.5,.5,.5,1.0) 
# create the new map 
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N) 

# define the bins and normalize 
bounds = np.linspace(0,20,21) 
norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 

# make the scatter 
scat = ax.scatter(x,y,c=tag,s=np.random.randint(100,500,20),cmap=cmap, norm=norm) 

# create a second axes for the colorbar 
ax2 = fig.add_axes([0.95, 0.1, 0.03, 0.8]) 
cb = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, norm=norm, spacing='proportional', ticks=bounds, boundaries=bounds, format='%1i') 

ax.set_title('Well defined discrete colors') 
ax2.set_ylabel('Very custom cbar [-]', size=12) 

enter image description here

私は個人的に特定の値を読み、そのビットハード20色の異なると思いますが、もちろんあなたに最高のthats。

+3

偉大な答え - 私は非常に*長い時間をオンライン文書から、多くのおかげで把握するだろうと思う – bph

+0

これが許可されているかどうかわからないが、あなたは私の質問[ここ] ://stackoverflow.com/questions/32766062/how-to-determine-the-colours-when-using-matplotlib-pyplot-imshow)? – Esoemah

38

一見単純な問題を解決するための正しい方法だと思うことはできません。

#!/usr/bin/env python 
""" 
Use a pcolor or imshow with a custom colormap to make a contour plot. 

Since this example was initially written, a proper contour routine was 
added to matplotlib - see contour_demo.py and 
http://matplotlib.sf.net/matplotlib.pylab.html#-contour. 
""" 

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('PiYG', 11) # 11 discrete colors 

im = imshow(Z, cmap=cmap, interpolation='bilinear', 
      vmax=abs(Z).max(), vmin=-abs(Z).max()) 
axis('off') 
colorbar() 

show() 

をどの私はあなたがを見てみたいと思う

poormans_contour

+6

cmap = cm.get_cmap( 'jet'、20)scatter(x、y、c) = tags、cmap = cmap)は私の中に入り込んできます。matplotlib – bph

0

次の画像を生成を使用してカラーマップを生成するか、スタティックなカラーマップが必要な場合は、an appに取り組んでいます。

+0

の役に立つドキュメンテーションを見つけるのは非常に難しいです。私のニーズには冗長かもしれませんが、グレーの値を既存のカラーマップにタグ付けする方法を提案できますか? 0値はグレーになり、他の値は色として出てくるのですか? – bph

+0

@Hiett y値に基づいてRGB配列color_listを生成し、それをListedColormapに渡すのはどうですか? color_list [y == value_to_tag] = gray_colorで値にタグを付けることができます。 – ChrisC

23

カラーマップの範囲の上または下の値を設定するには、カラーマップのset_overおよびset_underメソッドを使用することをお勧めします。特定の値にフラグを付ける場合は、マスクする(マスクされた配列を作成する)ようにして、set_badメソッドを使用します。 (ベースカラーマップクラスのドキュメントを見てください:http://matplotlib.org/api/colors_api.html#matplotlib.colors.Colormap):

import matplotlib.pyplot as plt 
import numpy as np 

# Generate some data 
x, y, z = np.random.random((3, 30)) 
z = z * 20 + 0.1 

# Set some values in z to 0... 
z[:5] = 0 

cmap = plt.get_cmap('jet', 20) 
cmap.set_under('gray') 

fig, ax = plt.subplots() 
cax = ax.scatter(x, y, c=z, s=100, cmap=cmap, vmin=0.1, vmax=z.max()) 
fig.colorbar(cax, extend='min') 

plt.show() 

enter image description here

+0

それは本当に良いです - 私はset_underを使ってみましたが、vminは含まれていなかったので、何もしていないと思います。 – bph

19

彼らはドン除いて上記の答えは」良いです

をそれはあなたがこのような何かをしたいように聞こえますカラーバーに適切なティック配置があります。私は色の真ん中に目盛りを付けて、数 - >色のマッピングがより明確になるのが好きです。あなたはmatshowコールの制限を変更することでこの問題を解決することができます

import matplotlib.pyplot as plt 
import numpy as np 

def discrete_matshow(data): 
    #get discrete colormap 
    cmap = plt.get_cmap('RdBu', np.max(data)-np.min(data)+1) 
    # set limits .5 outside true range 
    mat = plt.matshow(data,cmap=cmap,vmin = np.min(data)-.5, vmax = np.max(data)+.5) 
    #tell the colorbar to tick at integers 
    cax = plt.colorbar(mat, ticks=np.arange(np.min(data),np.max(data)+1)) 

#generate data 
a=np.random.randint(1, 9, size=(10, 10)) 
discrete_matshow(a) 

example of discrete colorbar

+0

個別のデータを見るときに、あなたの2番目の方法は正しいです。しかし、最初の方法は、一般的には_ワイン_です。カラーバー上の配置と矛盾する値でティックをラベリングしています。 'set_ticklabels(...)'は、ラベルの書式(10進数など)を制御するためにのみ使用してください。データが本当に離散的なものであれば、何の問題にも気づかないかもしれません。システムにノイズ(例えば、2→1.9)があると、この一貫性のないラベリングは、誤った色バールとなります。 –

+0

E.あなたは限界を変更することが優れた解決策だと思うので、他のものを削除しました。どちらも「ノイズ」をうまく処理できませんでした。連続したデータを処理するには、いくつかの調整が必要です。 –

関連する問題