YutaKaのPython教室

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

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

Matplotlibを使えば、様々な散布図を自由自在に描くことができます。

とはいっても、実際に使ってみると次のような問題に直面することも…。

  • Matplotlibで散布図を作成する方法がよくわからない…。
  • 散布図って何のためにあるの?全部、plt.plot()でグラフ作ればよくない?

そこで、今回は散布図について、次の内容をわかりやすく解説しました。

  • Matplotlibで散布図を描く基本的な方法
  • 散布図の見た目変更方法
  • 散布図の応用例|バブルチャート、クラスタリング、グルーピング

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

Matplotlibで散布図を作成するときの超基本

Matplotlibで散布図を作成する際には、主に2つの方式があります。

  • pltメソッドの場合:plt.scatter()
  • オブジェクト指向の場合:ax.scatter()

この記事では基本的にplt.scatter()で解説しますが、ax.scatter()でも挙動はほぼ同じです。

オブジェクト指向の方はax.scatter()で実行してください。

pltメソッドでのグラフ描画について、よくわからないという方は次のMatplotlib入門記事も参考にしてください。

≫【初心者向け】Matplotlibの特徴と使い方をわかりやすく解説!
脱初心者のためのMatplotlibマスターガイドです。そもそもどういう流れでプロットするのか?どんな種類のグラフが描けるのか?日本語設定は?タイトルや軸の設定は?オブジェクト指向って何?そんな疑問を解決します!この記事で、脱Matplotlib初心者を目指そう!
www.yutaka-note.com/entry/matplotlib_guid
 

また、fig, ax = plt.subplots()で始まるオブジェクト指向のプロットについては、次の記事で解説しています。

≫Matplotlib plt.subplots()の使い方|FigureとAxesを同時生成!
Matplotlibでグラフを描くとき「fig, ax = plt.subplots()って、よく見るけど何してるの?」「plt.subplots()の便利な使い方を知りたい! 」という方のために、plt.subplots()でFigureとAxesを作ると何が便利なのか、plt.subplots()の基本的な使い方、覚えておくと便利なplt.subplots()の引数をを図解付きで解説します!
www.yutaka-note.com/entry/matplotlib_subplots
 

基本的な散布図グラフの作成|plt.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モジュールに乱数関連の関数が複数用意されています。この記事では、図解・サンプルコードで乱数生成の基本、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()

凡例を追加したい場合は、次の記事を参考にしてください。

≫Matplotlib plt.legend() | 凡例の位置とスタイル設定完璧ガイド!
Matplotlibでは、デフォルトでは凡例は表示されません。「凡例(legend)を表示するにはどうしたらいいの?!」「凡例の位置や見た目の設定方法がわからない!」という方向けに、「凡例を表示する関数plt.legend()の使い方」「引数で位置や見た目を簡単に設定する方法」を紹介していきます。自分の作りたい凡例を作れるようになりましょう!
www.yutaka-note.com/entry/matplotlib_legend
 

以下では、散布図の見た目変更、散布図を応用したデータ可視化方法を次の通り解説していきます。

  • プロットの見た目設定
  • プロットの枠線設定
  • 散布図応用例|特徴量の可視化方法
    • バブルチャート
    • クラスタリング/グルーピング

プロットの見た目設定

プロットの見た目は、plt.scatter()のキーワード引数で変更することができます。

キーワード 設定内容 設定値の例
s プロットのサイズ 数値:一括設定
数値のリストなど:個別設定
facecolor or
c, color, fc
プロットの色を一括設定 色の名前など
cmap 特徴量に応じた色設定
※特徴量はc=array_likeで設定
カラーマップ名など
alpha プロットの透明度 0(完全透明)~(不透明)
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の値に応じて各プロットの色が自動設定されています。

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

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

凡例の付け方については、以下の記事でまとめています。

≫Matplotlib plt.legend() | 凡例の位置とスタイル設定完璧ガイド!
Matplotlibでは、デフォルトでは凡例は表示されません。「凡例(legend)を表示するにはどうしたらいいの?!」「凡例の位置や見た目の設定方法がわからない!」という方向けに、「凡例を表示する関数plt.legend()の使い方」「引数で位置や見た目を簡単に設定する方法」を紹介していきます。自分の作りたい凡例を作れるようになりましょう!
www.yutaka-note.com/entry/matplotlib_legend
 

透明度

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.plot()と共通です。plt.plot()の解説記事も参考にしてください。

≫Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
Matplotlibのplt.plotを使用したグラフを作成、グラフの見た目変更、タイトルや軸の設定など基本事項について徹底解説!!この記事を読めば、plt.plotで手軽に手早く簡単に、キレイなグラフ作成可能に!?
www.yutaka-note.com/entry/matplotlib_pyplot
 

プロットの枠線設定

プロットの枠線は、plt.scatter()のキーワード引数で設定・変更することができます。

キーワード 別名 設定内容 設定値の例
Edgecolor ec プロットの枠線の色 色の名前など
linewidth lw 線の太さ 数値ptで指定
linestyle ls 線のスタイル -, --, -., :, で指定

枠線の色変更

edgecolorに色名を渡します。

plt.scatter(x, y, color="white", edgecolor="red")
plt.show()

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

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

≫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()の機能を応用すれば、特徴量を可視化して求心的なグラフを作成することができます。

簡単な例として、次の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)&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の特徴と使い方をわかりやすく解説!
脱初心者のためのMatplotlibマスターガイドです。そもそもどういう流れでプロットするのか?どんな種類のグラフが描けるのか?日本語設定は?タイトルや軸の設定は?オブジェクト指向って何?そんな疑問を解決します!この記事で、脱Matplotlib初心者を目指そう!
www.yutaka-note.com/entry/matplotlib_guid
 

また、データ分析初心者の方にはこちらの記事もおススメです。

私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。

何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。

≫独学でデータ分析を勉強するオススメ学習本
独学でのpythonデータ分析勉強に役立ったおススメ書籍を紹介していきます。業務でそれなりにデータ分析を行えるまで、いろいろな試行錯誤をしてきましたが、もし自分が今ゼロから勉強する立場ならどうするのがいいのか考えてみました。以下では、入門書、個別モジュール用、実践用の3つの視点でおススメ本を紹介していきます。
www.yutaka-note.com/entry/data_analysis