YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで

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()の必須引数は次の通りです。

    引数 内容
x リストndarrayなど プロットするデータのxの値
y リストndarrayなど プロットするデータのyの値

pltメソッドとオブジェクト指向でそれぞれ、基本的な散布図を描いてみます。

まずMatplotlibをインポートして、サンプルグラフ用のデータを用意します。

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
 
#乱数を25個ずつ生成
x = np.random.randn(25)
y = np.random.randn(25)

乱数の生成については次の記事で解説しています。

≫NumPy random | randn、rand、randint全部あり!乱数関係総まとめ!
≫NumPy random | randn、rand、randint全部あり!乱数関係総まとめ!
NumPyでは、randomモジュールに乱数関連の関数が複数用意されています。この記事では、図解・サンプルコードで乱数生成の基本、rand()関連の関数についてまとめます!
www.yutaka-note.com/entry/numpy_random
 

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(完全透明)~(不透明)
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の値に応じて各プロットの色が自動設定されています。

カラーマップを含めた色の詳細については、次の記事でまとめています。

≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

透明度

alpha0から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()

この例では、線の色が見やすいように、プロット自体の色は白に変更しています。

【参考】色の設定について詳しく知りたい方はこちらをチェック!

≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

枠線の太さ変更

    edgewidthに太さを、数値ptで渡します。

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)&amp;(y>0) , 100, 0)
plt.scatter(x, y, s=area, alpha = 0.6)
 
# x <0, y<0のプロット作成
area = np.where( (x<0)&amp;(y<0) , 100, 0)
plt.scatter(x, y, s=area, alpha = 0.6)
 
# x >0, y<0のプロット作成
area = np.where( (x>0)&amp;(y<0) , 100, 0)
plt.scatter(x, y, s=area, alpha = 0.6)
 
plt.show()

簡単な条件分岐ですが、プロットがどの領域に存在するか一目でわかるようになりましたね。

おわりに:Matplotlib関連記事の紹介

今回は、Matplotlibの散布図の作成方法を解説しました。

散布図は少し手を加えるだけで、データの特徴量をわかりやすく可視化することができます!
ぜひ散布図をマスターして、伝わるグラフを目指しましょう!

Matplotlibマスターを目指す皆さんへの次のおススメコンテンツはこちらです!

≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
Jupyter Notebookでmatplotlibを使用する場合には、インポートする前に%matplotlib inlineと記述します。なぜinlineと入力しているのでしょうか?この記事では、matplotlib inlineの謎について解説していきたいと思います!
www.yutaka-note.com/entry/matplotlib_inline
 
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
グラフ内にテキストでコメントを記入することってよくありますよね?グラフにコメントがあると、グラフの大事な部分を強調して説明できます。この記事では、matplotlibでグラフ内にテキストを表示する方法、テキストの見た目の変更方法について図解・サンプルコード付きで解説しています!
www.yutaka-note.com/entry/2020/01/08/080413
 
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
Matplotlibで大変なのが軸周りの設定!グラフの「この要素」を変更するには、「どのメソッド」を使えばいいのかわからない…。という方のために、Matplotlibの軸・目盛り・目盛り線の設定について総まとめしました!これで軸周りの設定がだいぶ楽になります。軸周り完ぺきマスターガイド!
www.yutaka-note.com/entry/matplotlib_axis
 
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
Matplotlibで棒グラフを作成する方法がよくわからない…。 棒グラフで悩むなら、MatplotlibあきらめてExcel使おうかな…。 と思ったことはありませんか?そんな方のために、Matplotlibの棒グラフ作成方法を徹底的に解説しました!複数系列?積み上げ棒グラフ?全部大丈夫!
www.yutaka-note.com/entry/matplotlib_bar
 

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!