Pythonでグラフを描くときは、Matplotlib
を使うことが多いですが、
Matplotlib
で散布図を作成する方法がよくわからない…。- 散布図って何のためにあるの?全部、
plt.plot()
でグラフ作ればよくない?
という方のために、
Matplotlib
の散布図の作成方法- 散布図を応用したデータの可視化例
についてまとめしました。
散布図は少し手を加えるだけで、データの特徴量をわかりやすく可視化することができます!
ぜひ散布図をマスターして、伝わるグラフを目指しましょう!
Matplotlibで散布図を作成するときの超基本
Matplotlib
で散布図グラフを作成する際には、
- pltメソッドの場合:
plt.scatter()
- オブジェクト指向の場合:
ax.scatter()
を使用します。
この記事では基本的にplt.scatter()
で解説しますが、ax.scatter()
でも挙動はほぼ同じです。
オブジェクト指向の方はax.scatter()
で実行してください。
基本的な散布図グラフの作成
まず基本的な散布図グラフを作成するには、
plt.scatter(x, y)
でプロットを生成plt.show()
でグラフを表示
を行います。
plt.scatter()
の必須引数は次の通りです。
pltメソッドとオブジェクト指向でそれぞれ、基本的な散布図を描いてみます。
まずMatplotlib
をインポートして、サンプルグラフ用のデータを用意します。
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
#乱数を25個ずつ生成
x = np.random.randn(25)
y = np.random.randn(25)
乱数の生成については次の記事で解説しています。
pltメソッドとオブジェクト指向でそれぞれ散布図グラフを描きます。
plt.scatter(x, y)
plt.show()
fig, ax = plt.subplots()
ax.scatter(x, y)
plt.show()
pltメソッドでもオブジェクト指向でも同じグラフが出力されます。
(x, y)
の位置にプロットが作成されていますね。
複数系列の散布図の作成
複数系列のグラフを作成するには、plt.scatter()
を繰り返せばOKです。
# 1系列目のデータ生成
plt.scatter(x, y)
# 2系列目のデータ生成
x2 = np.random.randn(25)
y2 = np.random.randn(25)
# 2系列目のプロット生成
plt.scatter(x2, y2)
plt.show()
ここから先はより詳細な設定方法・用方法について、次の順番で解説していきます。
- プロットの見た目設定
- プロットの枠線設定
- 散布図応用例|特徴量の可視化方法
- バブルチャート
- クラスタリング/グルーピング
プロットの見た目設定
プロットの見た目は、plt.scatter()
のキーワード引数で変更することができます。
キーワード | 別名 | 設定内容 | 設定値の例 |
---|---|---|---|
s |
プロットのサイズ | 数値 :一括設定数値のリスト など:個別設定 |
|
facecolor |
c , color , fc |
プロットの色を一括設定 | 色の名前など |
cmap |
特徴量に応じた色設定 | カラーマップ名 | |
alpha |
プロットの透明度 | 0 (完全透明)~1 (不透明) |
|
marker |
プロットの形 | "." , "o" , "^" などで指定 |
サイズ変更
s
にプロットのサイズを、数値
または[数値のリスト]
で渡します。
数値
:グラフ全体に適用[数値のリスト]
など:各プロットサイズを個別設定リスト
のほかにndarray
なども可能
まず、単独の数値を指定して、グラフのプロットサイズを一括変更してみます。
plt.scatter(x, y, s=100)
plt.show()
次に、各プロットの特徴量に応じてプロットサイズを変更する例を紹介します。
いわゆるバブルチャートを作成することができます。
# 特徴量を乱数で生成
size = 150*np.random.rand(25)
plt.scatter(x, y, s=size)
plt.show()
色変更(系列毎)
facecolor
(またはc
, color
, fc
)に色名などを渡します。
plt.scatter(x, y, color="red")
plt.show()
plt.scatter()
を実行するたびに異なる色を指定すると、系列毎に色を指定できます。
2系列のグラフで、異なる色を適用してみます。
# 1系列目のデータ生成
plt.scatter(x, y, c="red")
# 2系列目のデータ生成
x2 = np.random.randn(25)
y2 = np.random.randn(25)
# 2系列目のプロット生成
plt.scatter(x2, y2, c="blue")
plt.show()
色変更(カラーマップ)
カラーマップを指定することで、特徴量に応じた色を設定することができます。
カラーマップを使用する際には
- 使用するカラーマップ名:
cmap = "カラーマップ名"
- 色付けに使用する特徴量:
c = [特徴量のリストなど]
の2つを与えます。
寒色系の"winter"
を使用した例がこちらです。
colors = np.random.rand(25)
plt.scatter(x, y, c=colors, cmap="winter")
plt.show()
明るい色の"spring"
を使用した例がこちらです。
colors = np.random.rand(25)
plt.scatter(x, y, c=colors, cmap="winter")
plt.show()
特徴量c
の値に応じて各プロットの色が自動設定されています。
カラーマップを含めた色の詳細については、次の記事でまとめています。
透明度
alpha
に0
から1
の数値で透明度を与えることができます。
0
:完全透明1
:不透明
alpha = 0.5
にして、半透明にしてみます。
plt.scatter(x, y, alpha=0.5)
plt.show()
プロットの形の変更
marker
に既定の文字列でスタイルを指定します。
使用頻度が高そうなスタイルを次の表にまとめています。
値 | プロットの形 |
---|---|
"." |
丸(デフォルト) |
'o' |
大きめの丸 |
'^' |
三角 |
"s" |
四角 |
'p' |
五角形 |
'8' |
八角形 |
'D' |
ひし形 |
プロットの形状は次のグラフを参考にしてください。
marker_list = [".", "o", "^", "s", "p", "8","D"]
for i, marker in enumerate(marker_list):
plt.scatter(i, i, marker=marker, s=200)
plt.show()
プロットの枠線設定
プロットの枠線は、plt.scatter()
のキーワード引数で設定・変更することができます。
キーワード | 別名 | 設定内容 | 設定値の例 |
---|---|---|---|
edgecolor |
ec |
プロットの枠線の色 | 色の名前など |
linewidth |
lw |
線の太さ | 数値 ptで指定 |
linestyle |
ls |
線のスタイル | - , -- , -. , : , で指定 |
枠線の色変更
edgecolor
に色名を渡します。
plt.scatter(x, y, color="white", edgecolor="red")
plt.show()
この例では、線の色が見やすいように、プロット自体の色は白に変更しています。
【参考】色の設定について詳しく知りたい方はこちらをチェック!
枠線の太さ変更
plt.scatter(x, y, color="white", edgecolors="red", linewidths=3)
plt.show()
枠線のスタイル
linestyle
にスタイルを、'-'
, '--'
, '-.'
, ': '
, で指定します。
値 | 線の種類 |
---|---|
'-' |
実線 —— |
'--' |
破線 — — |
'-.' |
一点鎖線 —・— |
':' |
点線 ・・・・ |
破線を適用した例を紹介します。
line_styles = ["-", "--", "-.", ":"]
for i, style in enumerate(line_styles):
plt.scatter(i, i, s=250, color="white", edgecolors="black", linestyle=style)
plt.show()
散布図応用例|特徴量の可視化方法
plt.scatter()
の機能を応用すれば、特徴量を可視化して求心的なグラフを作成することができます。
ここでは、特徴量はプロット(x, y)
が追加で持つデータc
だと考えてください。
簡単な例として、
- バブルチャート
- クラスタリング/グルーピング
を紹介します。
バブルチャート
バブルチャートは、
- 特徴量に応じてプロットのサイズや色を変化させる
- 特徴量が大きい⇒プロットサイズも大きい
という特徴をもったグラフで、データの意味を直感的に読み取りやすくなります。
特徴量c
に応じてサイズと色を変化させるバブルチャートを紹介します。
# プロットのxとyを用意
x = np.random.randn(100)
y = np.random.randn(100)
# プロットの特徴量を用意
c = np.random.rand(100)*300
# 散布図作成(sizeとcolorに特徴量を渡す。カラーマップはwinter使用)
plt.scatter(x, y, s=c, color=c, cmap="winter", alpha=0.6)
plt.show()
特徴量が大きいとプロットが大きく、色も明るくなっています。
プロットの持つ特徴が一目でわかりますね。
クラスタリング/グルーピング
条件分岐でプロットの色やサイズを変更すれば、簡単にクラスタリング/グルーピングが可能です。
一番簡単な方法は
- 条件を満たさない⇒プロットサイズを
0
- 条件を満たす⇒プロットサイズを適当な値
に設定する方法です。
簡単な例として、プロットの位置でクラスタリング/グルーピングする例を紹介します
# プロットのxとyを用意
x = np.random.randn(100)
y = np.random.randn(100)
# x >0, y>0のプロット作成
area = np.where( (x>0)&(y>0) , 100, 0)
plt.scatter(x, y, s=area, alpha = 0.6)
# x <0, y>0のプロット作成
area = np.where( (x<0)&(y>0) , 100, 0)
plt.scatter(x, y, s=area, alpha = 0.6)
# x <0, y<0のプロット作成
area = np.where( (x<0)&(y<0) , 100, 0)
plt.scatter(x, y, s=area, alpha = 0.6)
# x >0, y<0のプロット作成
area = np.where( (x>0)&(y<0) , 100, 0)
plt.scatter(x, y, s=area, alpha = 0.6)
plt.show()
簡単な条件分岐ですが、プロットがどの領域に存在するか一目でわかるようになりましたね。
おわりに:Matplotlib関連記事の紹介
今回は、Matplotlib
の散布図の作成方法を解説しました。
散布図は少し手を加えるだけで、データの特徴量をわかりやすく可視化することができます!
ぜひ散布図をマスターして、伝わるグラフを目指しましょう!
Matplotlib
マスターを目指す皆さんへの次のおススメコンテンツはこちらです!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!