pyplot.scatter(x,y,s,c....)関数の場合、
matplotlib のドキュメントには次のように記載されています:
c : 色、シーケンス、または色のシーケンス、オプション、デフォルト: 'b' マーカーの色。可能な値:
単一のカラー フォーマット文字列。長さ n のカラー指定のシーケンス。cmap と norm を使用してカラーにマッピングされる n 個の数値のシーケンス。行が RGB または RGBA である 2 次元配列。c は単一の数値 RGB または RGBA シーケンスであってはならないことに注意してください。これは、カラーマッピングされる値の配列と区別がつかないためです。すべてのポイントに同じ RGB または RGBA 値を指定する場合は、単一行の 2 次元配列を使用します。
しかし、データポイントの色を希望どおりに変更する方法がわかりません。
次のようなコードがあります:
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model
import matplotlib
%matplotlib inline
matplotlib.rcParams['figure.figsize'] = (13.0, 9.0)
# Generate a dataset and plot it
np.random.seed(0)
X, y = sklearn.datasets.make_moons(200, noise=0.55)
print(y)
plt.scatter(X[:,0], X[:,1], c=y)#, cmap=plt.cm.Spectral)
必要に応じて、色を変更して黒と緑のデータポイントにするにはどうすればいいですか? あるいは、他の方法はありますか? また、cmap が具体的に何をするのか説明してください。
plt.cm.Spectral を使用するたびにプロットがマゼンタと青になるのはなぜですか?
ベストアンサー1
散布点を色分けする方法には基本的に 2 つのオプションがあります。
1. 外部マッピング
scatter
外部的に値を色にマップし、それらの色のリスト/配列を の引数に指定することもできますc
。
z = np.array([1,0,1,0,1])
colors = np.array(["black", "green"])
plt.scatter(x,y, c=colors[z])
2. 内部マッピング
明示的な色の他に、正規化とカラーマップに従って色にマッピングされる値のリスト/配列を指定することもできます。
- Aは、 ~の間の float 値を入力として受け取り、RGB カラーを返す
colormap
呼び出し可能オブジェクトです。0.
1.
- 正規化は、任意の数値を入力として受け取り、事前に設定された制限に基づいて別の数値を出力する呼び出し可能オブジェクトです。 の通常の場合、 と の間の値は、との間の範囲に
Normalize
線形マッピングされます。vmin
vmax
0.
1.
あるデータから色を取得する自然な方法は、2つを連鎖させることです。
cmap = plt.cm.Spectral
norm = plt.Normalize(vmin=4, vmax=5)
z = np.array([4,4,5,4,5])
plt.scatter(x,y, c = cmap(norm(z)))
ここで、 の値は正規化によって に4
マッピングされ0
、 の値は5
にマッピングされる1
ため、カラーマップは最も外側の 2 つの色を提供します。
このプロセスは、scatter
数値の配列が に提供された場合にで内部的に実行されますc
。
Ascatter
は を作成しPathCollection
、これは をサブクラス化しますScalarMappable
。A はScalarMappable
カラーマップ、正規化、および値の配列で構成されます。したがって、上記は次のように内部化されます。
plt.scatter(x,y, c=z, norm=norm, cmap=cmap)
最小データと最大データを正規化の制限として使用する場合は、その引数を省略できます。
plt.scatter(x,y, c=z, cmap=cmap)
これが、 に提供された値に関係なく、質問の出力が常に紫色と黄色の点になる理由ですc
。
配列とを黒と緑の色にマッピングするという要件に戻る0
と1
、matplotlib が提供するカラーマップそして黒と緑で構成されたカラーマップを探します。例えば、nipy_spectral
カラーマップ
ここで、黒はカラーマップの先頭にあり、緑は中間のどこか、たとえば にあります。したがって、 を 0 に設定し、(緑にマッピングされる値)となるように、0.5
つまり に設定する必要があります。vmin
vmax
vmax*0.5 = 1
1
vmax = 1./0.5 == 2
import matplotlib.pyplot as plt
import numpy as np
x,y = np.random.rand(2,6)
z = np.array([0,0,1,1,0,1])
plt.scatter(x,y, c = z,
norm = plt.Normalize(vmin=0, vmax=2),
cmap = "nipy_spectral")
plt.show()
必要な色のカラーマップが常に存在するとは限らず、既存のカラーマップから色の位置を取得するのが簡単ではない場合があるため、代替手段として、目的に合わせて新しいカラーマップを作成することもできます。
ここでは、黒と緑の 2 色のカラーマップを単純に作成します。
matplotlib.colors.ListedColormap(["black", "green"])
ここでは値が 2 つしかないため、自動正規化に依存できるため、正規化は必要ありません。
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
x,y = np.random.rand(2,6)
z = np.array([0,0,1,1,0,1])
plt.scatter(x,y, c = z, cmap = mcolors.ListedColormap(["black", "green"]))
plt.show()