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

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

Matplotlibの使い方
Aru

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で半透明にしています。

カラーマップを使った実行例1

このように、各点にクラスを設定すれば、簡単に色をつけることが可能です。

カラーマップの種類

先ほどの例ではデフォルトのカラーマップを利用していましたが、カラーマップは以下から選択可能です。カラーマップは選択できます。以下は、選択できるカラーマップです。

カラーマップのサンプル
Screenshot
Screenshot
Screenshot

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

カラーマップの確認方法

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()
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を使うことをおすすめします。デフォルトでもかなり綺麗描画が可能です。

Seabornチートシート(目的のグラフ別早引き形式)【Python】
Seabornチートシート(目的のグラフ別早引き形式)【Python】
Seaborn Objectsチートシート|新しい描画インタフェースの使い方【Python】
Seaborn Objectsチートシート|新しい描画インタフェースの使い方【Python】

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

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

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

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

参考ず

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

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

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました