【python】matplotlibの散布図で分類別に色を変える|カラーマップ(colormap)の使い方
matplotlibの散布図で、データの分類毎に色を変えたいことはないでしょうか。
この記事では、散布図で点の色を変える方法を解説します。
なお、pythonのグラフ描画ではseabornを使う方法もあります。seabornについては、以下の記事も参考にしてください。
はじめに
データ分析など行う場合に、データの分類毎に色を変えたい場合があります。ここでは、matplotlibの散布図で点の色をクラス別に変える方法のサンプルです。
matplotlibの散布図で分類ごとに点の色を変えるには
カラーマップを利用
カラーマップを利用すれば実現できます。
以下は、(x, y)をランダムに100個作成し、それぞれをクラス0,1に分け、点の色を変えてプロットする例です。
点が重なった場合にも見えるように、alpha=0.5
で半透明にしています。
import matplotlib.pyplot as plt
import random
n = 100
x = [random.random() for _ in range(n)]
y = [random.random() for _ in range(n)]
cls = [random.random() >= 0.5 for _ in range(n)]
plt.scatter(x, y, c=cls, alpha=0.5)
カラーマップの種類
カラーマップは選択できます。以下は、選択できるカラーマップです(クリックで拡大します)
設定する場合は、名前を指定します。カラーマップの指定はcmap
です。
import matplotlib.pyplot as plt
import random
n = 100
x = [random.random() for _ in range(n)]
y = [random.random() for _ in range(n)]
cls = [random.random() >= 0.5 for _ in range(n)]
plt.scatter(x, y, c=cls, alpha=0.5, cmap="plasma")
plt.show()
グラデーション系を使う場合は、0が白になるので、少し工夫します。具体的には、cls
の0を別の値に書き換えます。下の例では0を0.5に置き換えています。ただ、このままだと、値の範囲で自動的に調整が行われるので、vmax
, vmin
で値の範囲を調整しています。
import matplotlib.pyplot as plt
import random
n = 100
x = [random.random() for _ in range(n)]
y = [random.random() for _ in range(n)]
cls = [1if random.random()>=0.5 else 0.5 for _ in range(n)]
plt.scatter(x, y, c=cls, alpha=1, vmin=0, vmax=1, cmap="YlOrRd")
plt.show()
カラーマップの確認方法
Google Colabの場合、以下のコードをセルで実行することでカラーマップを確認できます
import matplotlib.pyplot as plt
cmap = plt.get_cmap("plasma")
cmap
任意の色を設定したい場合
cmap='xxx'
と指定した場合は自動で色が選択されてしまいます。任意の色をつけたい場合はすこし面倒ですが以下のようなコードで行うことができます。
import matplotlib.pyplot as plt
import numpy as np
import random
n = 100
x = np.random.rand(n)
y = np.random.rand(n)
cls = np.random.rand(n) >= 0.5
cmap = plt.get_cmap("tab10")
plt.scatter(x[cls==True], y[cls==True], c=cmap(0), alpha = 0.5)
plt.scatter(x[cls==False], y[cls==False], c=cmap(1), alpha = 0.5)
plt.show()
まず、x, y, clsをnumpy.random.rand(n)
で作成しています。
cmap=plt.get_cmap("tab10")
で以下のカラーマップを取得しています。
plt.scatter
では、cls==True
とcls==False
のそれぞれを個別にプロットしています。ここでc=cmap(0)
, c=cmap(1)
とすることで、カラーマップの0番目の色と1番目の色を選択しています。ここは、ダイレクトにR
, G
, B
などを指定してもOKです。
このように、条件に合う点だけを抜き出して、個別にプロットすることで好きな色をつけることが可能です。
個人的には、グラフを綺麗に描画したいなら、seabornを使うことをおすすめします。デフォルトでもかなり綺麗描画が可能です。
参考:色分けはどんな時に使う?
私は、機械学習の結果の確認などに利用しています。例えば、出力されたスコアに対してクラスの分類がどう分布しているかなどの確認での利用です。
以下はその例になります。縦軸が予測値(0〜1)、横軸を予測値の昇順、色をクラスのグラフを作ると、どの程度判定ミスがあるか、どのあたりを閾値とすれば良いかを検討する参考にすることができます。
例えば、下の図の場合は、予測値0.8を閾値にしても、数個ミスが出ることがわかります。
また、EDA(Explanatory Data Analysis)にも使うことがあります。データを視覚的に見やすくするのに色分けは有効です。