Matplotlib
を使えば、様々な散布図を自由自在に描くことができます。
とはいっても、実際に使ってみると次のような問題に直面することも…。
Matplotlib
で散布図を作成する方法がよくわからない…。- 散布図って何のためにあるの?全部、
plt.plot()
でグラフ作ればよくない?
そこで、今回は散布図について、次の内容をわかりやすく解説しました。
Matplotlib
で散布図を描く基本的な方法- 散布図の見た目変更方法
- 散布図の応用例|バブルチャート、クラスタリング、グルーピング
散布図は少し手を加えるだけで、データの特徴量をわかりやすく可視化することができます!
ぜひ散布図をマスターして、伝わるグラフを目指しましょう!
Matplotlibで散布図を作成するときの超基本
Matplotlib
で散布図を作成する際には、主に2つの方式があります。
- pltメソッドの場合:
plt.scatter()
- オブジェクト指向の場合:
ax.scatter()
この記事では基本的にplt.scatter()
で解説しますが、ax.scatter()
でも挙動はほぼ同じです。
オブジェクト指向の方はax.scatter()
で実行してください。
pltメソッドでのグラフ描画について、よくわからないという方は次のMatplotlib入門記事も参考にしてください。
また、fig, ax = plt.subplots()
で始まるオブジェクト指向のプロットについては、次の記事で解説しています。
基本的な散布図グラフの作成|plt.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 or c , color , fc |
プロットの色を一括設定 | 色の名前など |
cmap |
特徴量に応じた色設定 ※特徴量は c=array_like で設定 |
カラーマップ名など |
alpha |
プロットの透明度 | 0 (完全透明)~1 (不透明) |
marker |
プロットの形 | "." , "o" , "^" などで指定 |
サイズ変更
s
にプロットのサイズを、数値
または[数値のリスト]
などで渡します。
s=数値
:グラフ全体に適用s=[数値のリスト]
など:各プロットサイズを個別設定[数値のリスト]
などはarray_like
ならOK
まず、単独の数値を指定して、プロットサイズを一括変更してみます。
plt.scatter(x, y, s=100)
plt.show()
次に、各プロットの特徴量に応じてプロットサイズを変更する例を紹介します。
いわゆるバブルチャートを作成することができます。
# 特徴量を乱数で生成
size = 150*np.random.rand(25)
plt.scatter(x, y, s=size)
plt.show()
色変更(系列毎)
プロットの色を変更する場合はfacecolor
に色名などを渡します。
facecolor="色名など"
c
,color
,fc
は、facecolor
のエイリアス(別名)
plt.scatter(x, y, facecolor="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.plot()
と共通です。plt.plot()
の解説記事も参考にしてください。
プロットの枠線設定
プロットの枠線は、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()
の機能を応用すれば、特徴量を可視化して求心的なグラフを作成することができます。
簡単な例として、次の2つの例を紹介します。
- バブルチャート
- クラスタリング/グルーピング
バブルチャート
バブルチャートは、各プロットの特徴量を視覚的に表現するグラフの一つです。
次のように特徴量を表現することで、データの意味を直感的に読み取りやすくします。
- 特徴量に応じてプロットのサイズや色を変化させる
- 特徴量に応じてプロットサイズを変化させる
特徴量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
は奥の深いモジュールですが、なかなかわかりにくい部分もあります…。
そこで、グラフの作成方法、種類変更、凡例、タイトルの設定など網羅的にわかりやすく整理した記事を作りました。ぜひ参考にしてみてください。
また、データ分析初心者の方にはこちらの記事もおススメです。
私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。
何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。