このページではmatplotlibを使用して散布図を描画する方法について解説します。figure、axesについて知らない方は事前に以下を一読することをおすすめします。
matplotlib入門
matplotlibの基本 figureとaxes
Contents
簡単な散布図
散布図とは2次元のデータ配列の散らばり具合を可視化した図です。Pythonで散布図を描画する場合、matplotlibのaxes.scatterを使用します。(MATLAB形式のpyplot.scatterを使用する方法もありますが、OO形式の記述が推奨されているためそちらの説明は割愛します。参考:2つの書き方)
まずは適当に3点をプロットしてみましょう。pyplotはx、yそれぞれの座標のリストやnumpyの配列等のシーケンスを指定します。例えば、(1, 2)、(2, 4)、(3, 6)の3点をプロットしたい場合、X = [1, 2, 3]、Y = [2, 4, 6]と2つリストを指定することになります。
import matplotlib.pyplot as plt # 対象データ x = [1, 2, 3] y = [2, 4, 6] # figureを生成する fig = plt.figure() # axをfigureに設定する ax = fig.add_subplot(1, 1, 1) # axesに散布図を設定する ax.scatter(x, y, c='b') # 表示する plt.show()
以下のように表示されます。簡単に散布図を作成することができました。
axes.scatterの使い方
次にaxes.scatterについて詳しいパラメータを紹介します。よく使われるパラメータは以下の通りとなります。
s=None,
c=None,
marker=None,
cmap=None,
norm=None,
vmin=None,
vmax=None,
alpha=None,
linewidths=None,
verts=None,
edgecolors=None,
plotnonfinite=False,
data=None)
パラメータ | 説明 |
---|---|
x, y | x軸、y軸ごとのデータ配列 |
s | マーカーサイズ |
c | 色 |
marker | マーカーの形 |
alpha | マーカーの透明度(0〜1を指定、0:完全透明、1:不透明) |
linewidths | マーカーのエッジ線の太さ |
edgecolors | マーカーのエッジ線の色 |
上記以外にカラーマップ、カラーバーを表すことができるパラメータも存在します。以下を参照してください。
matplotlib カラーバー付き散布図
2021/4 以降のサンプルコードのlinewidthsの設定値が文字列になっていたため修正しました。ご連絡くださった方ありがとうございます。
プロットマーカーの大きさ、色、透明度を変更
ここからはマーカーの大きさ等の散布図のカスタマイズについて解説します。sでマーカーの大きさ、alphaで透明度、cもしくはcolorでマーカー内の色、edgecolorsでマーカーのエッジの色を指定することができます。今度は要素数をnp.random.randで生成してみます。
from matplotlib import pyplot as plt import numpy as np # ランダムな点を生成する x = np.random.rand(50) y = np.random.rand(50) # figureを生成する fig = plt.figure() # axをfigureに設定する ax = fig.add_subplot(1, 1, 1) # プロットマーカーの大きさ、色、透明度を変更 ax.scatter(x, y, s=300, alpha=0.5, linewidths=2, c='#aaaaFF', edgecolors='b') plt.show()
見せ方のテクニックなのですが、サンプルのようにエッジの色と中の色は同系統にし、エッジの方を濃い目の色にすると綺麗に見えます。
複数の系列を色分けしてプロットする
scatterを系列ごとに呼び出すだけで複数の系列を色分けしてプロットすることができます。青、赤2色で2系列を分けてみましょう。
from matplotlib import pyplot as plt import numpy as np # ランダムな点を生成する x1 = np.random.rand(30) y1 = np.random.rand(30) x2 = np.random.rand(30) y2 = np.random.rand(30) # figureを生成する fig = plt.figure() # axをfigureに設定する ax = fig.add_subplot(1, 1, 1) # x1, y1を青色でプロット ax.scatter(x1, y1, s=300, alpha=0.5, linewidths=2, c='#aaaaFF', edgecolors='b') # x2, y2を青色でプロット ax.scatter(x2, y2, s=300, alpha=0.5, linewidths=2, c='#FFaaaa', edgecolors='r') plt.show()

マーカーの形を指定
markerを指定すると、マーカーの形を変えることができます。よく見かけるものを挙げます。
- o:円
- D:菱型
- s:四角
- p:五角形
- h:六角形
- *:星形
$記号で挟むと任意の文字列のマーカーも利用できます。
サンプルコード
from matplotlib import pyplot as plt import numpy as np # ランダムな点を生成する x1 = np.random.rand(20) y1 = np.random.rand(20) x2 = np.random.rand(20) y2 = np.random.rand(20) x3 = np.random.rand(20) y3 = np.random.rand(20) # figureを生成する fig = plt.figure() # axをfigureに設定する ax = fig.add_subplot(1, 1, 1) # スター ax.scatter(x1, y1, s=300, alpha=0.5, linewidths=2, c='#FFFF00', edgecolors='#F0B325', marker='*', label='*') # 菱型 ax.scatter(x2, y2, s=300, alpha=0.5, linewidths=2, c='#aaaaFF', edgecolors='b', marker='D', label='D') # 文字 ax.scatter(x3, y3, s=300, alpha=0.5, linewidths=2, c='#DDDDDD', edgecolors='k', marker='$--->$', label='D') plt.show()
凡例、タイトル等
基本的にはaxesのカスタマイズ グラフの汎用要素で説明したとおりですが、よくサイト内を検索されるため凡例、ラベルなどの各種グラフ要素を挿入したサンプルを掲載します。詳しくはリンク先を参照してください。
from matplotlib import pyplot as plt import numpy as np # ランダムな点を生成する x1 = np.random.rand(30) y1 = np.random.rand(30) x2 = np.random.rand(30) y2 = np.random.rand(30) # figureを生成する fig = plt.figure() # axをfigureに設定する ax = fig.add_subplot(1, 1, 1) # x1, y1を青色でプロット ax.scatter(x1, y1, s=300, alpha=0.5, linewidths=2, c='#aaaaFF', edgecolors='b') # x2, y2を青色でプロット ax.scatter(x2, y2, s=300, alpha=0.5, linewidths=2, c='#FFaaaa', edgecolors='r') # 汎用要素を表示 ax.grid(True) # grid表示ON ax.set_xlim(left=-2, right=2) # x範囲 ax.set_ylim(bottom=-2, top=2) # y範囲 ax.set_xlabel('X') # x軸ラベル ax.set_ylabel('Y') # y軸ラベル ax.set_title('ax title') # グラフタイトル ax.legend(['x1, y1', 'x2, y2']) # 凡例を表示 plt.show()
出力結果
範囲指定やグリッド、軸ラベル、凡例の表示がされていることが確認できます。
蛇足 かわいいグラフを描いてみる
マーカーに$\heartsuit$とかを指定すると、ハート記号とかを表示することができますので以下のようなかわいい散布図を作成することも可能です。
サンプルコード
from matplotlib import pyplot as plt import numpy as np # ランダムな点を生成する x1 = np.random.rand(10) y1 = np.random.rand(10) x2 = np.random.rand(10) y2 = np.random.rand(10) # figureを生成する fig = plt.figure(facecolor='#FFE0E0') # axをfigureに設定する ax = fig.add_subplot(1, 1, 1, facecolor='#FFFAFF') ax.axvspan(0, 0.05, color='#A0A0FF', alpha=0.5) ax.axhspan(0, 0.05, color='#D0D0FF', alpha=0.5) ax.scatter(x1, y1, s=600, alpha=0.5, linewidths=2, c='#FFFF00', edgecolors='#F0B325', marker='*') ax.scatter(x2, y2, s=1000, alpha=0.5, linewidths=1, c='#FFAAAA', edgecolors='#FFAAAA', marker='$\heartsuit$') plt.show()
真面目なプレゼンで使用すると顰蹙を買うこと請け合いです。