【python】matplotlibの散布図で分類別に色を変える方法(colormap活用法)

matplotlibを使って散布図を作成する際、データを分類ごとに色分けしたいと思ったことはありませんか?この記事では、カラーマップ(colormap)機能を利用して、分類別に散布図の点の色を変える方法について、コード例を交えてわかりやすく解説します。
はじめに
データ分析を行う際、複数のクラスやカテゴリに属するデータを視覚的に区別するため、散布図の点の色を分類ごとに変えたい場合があります。
本記事では、matplotlibライブラリのcolormapを使用して、データのクラス別に点の色を変える方法を紹介します。
カラーマップ
カラーマップを利用すれば散布図の点を指定した色にすることが可能です。具体的には、各点(X, Y)に対して、属するクラスを設定し、クラスに対して色を指定する形になります。
以下のプログラムは実際に色を指定するものです。
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)
plt.show()
上記のプログラムでは(x, y)をランダムに100個作成し、それぞれをクラス0,1に分け、点の色を変えてプロットしています。なお、点が重なった場合にも見えるように、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 = [1 if 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


コマンドラインの場合は、以下のようにしてください。
import matplotlib.pyplot as plt
cmap = plt.get_cmap("plasma")
plt.imshow([list(range(100))]*20, cmap=cmap)
plt.show()
上記のコードで色サンプルを表示できます。
任意の色を設定したい場合
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)にも使うことがあります。データを視覚的に見やすくするのに色分けは有効です。