プログラミング
記事内に商品プロモーションを含む場合があります

【python】matplotlibの散布図で分類別に色を変える|カラーマップ(colormap)の使い方

Matplotlibの使い方
tadanori

matplotlibの散布図で、データの分類毎に色を変えたいことはないでしょうか。

この記事では、散布図で点の色を変える方法を解説します。

なお、pythonのグラフ描画ではseabornを使う方法もあります。seabornについては、以下の記事も参考にしてください。

【Python】seabornチートシート(グラフサンプル、使い方を解説)
【Python】seabornチートシート(グラフサンプル、使い方を解説)
Seaborn Objectsチートシート|グラフサンプル・使い方【Python】
Seaborn Objectsチートシート|グラフサンプル・使い方【Python】

はじめに

データ分析など行う場合に、データの分類毎に色を変えたい場合があります。ここでは、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)
カラーマップを使った実行例1

カラーマップの種類

カラーマップは選択できます。以下は、選択できるカラーマップです(クリックで拡大します

設定する場合は、名前を指定します。カラーマップの指定は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()
カラーマップを使った実行例3

カラーマップの確認方法

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()
cmapを自分で設定

まず、x, y, clsをnumpy.random.rand(n)で作成しています。

cmap=plt.get_cmap("tab10")で以下のカラーマップを取得しています。

plt.scatterでは、cls==Truecls==Falseのそれぞれを個別にプロットしています。ここでc=cmap(0), c=cmap(1)とすることで、カラーマップの0番目の色と1番目の色を選択しています。ここは、ダイレクトにR, G, Bなどを指定してもOKです。

このように、条件に合う点だけを抜き出して、個別にプロットすることで好きな色をつけることが可能です。

個人的には、グラフを綺麗に描画したいなら、seabornを使うことをおすすめします。デフォルトでもかなり綺麗描画が可能です。

【Python】seabornチートシート(グラフサンプル、使い方を解説)
【Python】seabornチートシート(グラフサンプル、使い方を解説)
Seaborn Objectsチートシート|グラフサンプル・使い方【Python】
Seaborn Objectsチートシート|グラフサンプル・使い方【Python】

参考:色分けはどんな時に使う?

私は、機械学習の結果の確認などに利用しています。例えば、出力されたスコアに対してクラスの分類がどう分布しているかなどの確認での利用です。

以下はその例になります。縦軸が予測値(0〜1)、横軸を予測値の昇順、色をクラスのグラフを作ると、どの程度判定ミスがあるか、どのあたりを閾値とすれば良いかを検討する参考にすることができます。

例えば、下の図の場合は、予測値0.8を閾値にしても、数個ミスが出ることがわかります。

参考ず

また、EDA(Explanatory Data Analysis)にも使うことがあります。データを視覚的に見やすくするのに色分けは有効です。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

記事URLをコピーしました