matplotlibで散布図の離散カラーバーを作成しようとしています
私はx、yデータを持っており、各ポイントには一意の色で表現したい整数タグ値があります。例:
plt.scatter(x, y, c=tag)
通常、タグは0~20の整数になりますが、正確な範囲は変わる可能性があります。
これまではデフォルト設定を使用してきました。
plt.colorbar()
これにより、連続した色の範囲が得られます。理想的には、n 個の個別の色のセット (この例では n=20) が必要です。さらに良いのは、タグ値を 0 にして灰色を生成し、1 ~ 20 をカラフルにすることです。
いくつかの「クックブック」スクリプトを見つけましたが、それらは非常に複雑で、一見単純な問題を解決する正しい方法だとは思えません。
ベストアンサー1
BoundaryNorm を散布図の正規化子として使用することで、カスタムの離散カラーバーを簡単に作成できます。奇妙な点は (私の方法では) 0 を灰色で表示することです。
画像の場合、cmap.set_bad() をよく使用して、データを NumPy マスク配列に変換します。0 をグレーにするのはずっと簡単ですが、散布図やカスタム cmap ではこれを機能させることができませんでした。
代わりに、独自の cmap を最初から作成することも、既存の cmap を読み込んで特定のエントリだけを上書きすることもできます。
import numpy as np
import matplotlib as mpl
import matplotlib.pylab as plt
fig, ax = plt.subplots(1, 1, figsize=(6, 6)) # setup the plot
x = np.random.rand(20) # define the data
y = np.random.rand(20) # define the data
tag = np.random.randint(0, 20, 20)
tag[10:12] = 0 # make sure there are some 0 values to show up as grey
cmap = plt.cm.jet # define the colormap
# 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 = mpl.colors.LinearSegmentedColormap.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 = plt.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)
個人的には、20 種類の色があると、特定の値を読み取るのが少し難しいと思いますが、もちろんそれはあなた次第です。