🍣

[Matplotlib入門シリーズ第4回] 様々なグラフ(ヒストグラム・散布図など)

に公開

はじめに

本記事は「Pythonでデータを可視化するMatplotlib入門」シリーズの第4回です.

前記事までは,

  • 線グラフ・点グラフを中心とした描画
  • タイトル・軸・凡例・グリッド・表示範囲
    などの描画方法およびグラフ装飾を学びました.

本記事では 目的に応じたグラフの種類を選択する力 を身につけます.

私のMatplotlibライブラリのバージョンは "3.7.0" です.

本シリーズの構成

本シリーズの構成予定(全11記事)は以下を想定しています.

  1. Matplotlibのインストール 〜 線グラフの描画
  2. 基本的な2次元プロット(線グラフ・点グラフ・複数データ・グラフの見た目)
  3. グラフ装飾(タイトル・軸・凡例・グリッド・表示範囲)
  4. 様々なグラフ(ヒストグラム・散布図など)(本記事)
  5. サブプロット
  6. 2次元図形の描画(公開後にリンクを追加する予定)
  7. 画像表示とヒートマップ(公開後にリンクを追加する予定)
  8. 3次元プロット(公開後にリンクを追加する予定)
  9. 3次元図形の描画(公開後にリンクを追加する予定)
  10. アニメーション描画1(公開後にリンクを追加する予定)
  11. アニメーション描画2(公開後にリンクを追加する予定)

本シリーズのゴール

本シリーズでは,以下のポイントが実装できるようになることを目標としています.

  • 目的に応じたグラフを選択できるようになる
  • 誰にでも分かるようなグラフを作成できるようになる
  • 意図通りにアルゴリズムが動いているかのアニメーションを作成できるようになる

グラフの可視化を "判断・説明・検証" に使えるようになること.

本記事のゴール

本記事では,以下の内容を学ぶことができます.

  • ヒストグラム (データの分布を確認)
  • 棒グラフ (量データの比較)
  • 散布図 (データ間の関係性を確認)
  • 円グラフ (全体に対する割合を確認)

目的に応じたグラフの種類を選択する力を身につける ことが,本記事のゴールです.

MatplotlibライブラリとNumPyライブラリの読み込み

Matplotlibを使うためには,まずライブラリの読み込みから始めます.
NumPyにより可視化したいデータを作成し,Matplotlibによりデータを可視化します.

import matplotlib.pyplot as plt
import numpy as np

numpyライブラリを np という名前として,扱えるようにしています.
Matplotlibライブラリのpyplotモジュールを plt という名前として,扱えるようにしています.
以降では pltnp という名前を使っていきます.

ヒストグラム

ヒストグラムの描画方法を説明します.
ヒストグラムとは,

  • データの分布 を確認
  • どの値がどれくらい出現しているかの可視化

するためのグラフです.

具体的なヒストグラムは下図の通りです.
ヒストグラム

# 正規分布に従ったデータを取得
datas = np.random.normal(loc=50, scale=10, size=1000)

# ヒストグラムの作成
plt.hist(datas, bins=30)
# グラフにタイトルを追加
plt.title("Histogram")
# X軸(横軸)のラベル作成
plt.xlabel("value")
# Y軸(縦軸)のラベル作成
plt.ylabel("freequency")
# グリッドを表示
plt.grid(True)
# 作成したグラフを画面に表示
plt.show()

plt.hist() の概要,引数,戻り値に関して,下表にまとめました.

備考
概要 ヒストグラムの作成 -
引数 たくさんある 後ほど説明
戻り値1 各ビンの値 NumPy配列.データ数は ビンの数
戻り値2 各ビンの縁 NumPy配列.データ数は ビンの数+1
戻り値3 BarContainerオブジェクト 全ビンの情報

使用頻度の高い plt.hist() の引数を下表にまとめました.

引数 意味 備考
x 数値データ 1次元配列
bins ビン(区間)の数 デフォルトは10
range 表示範囲 外れ値の除外
デフォルトはNone
density 頻度 or 確率 True:確率密度
False:度数(件数)
デフォルトはFalse
cumulative 累積度数 True:累積度数
False:累積度数ではない
align ビンの整列 left:左揃え.mid:中央揃え(デフォルト).right:右揃え

plt.hist() の引数 bins, density, cumulative, align の設定値およびグラフを下記に示します.

引数 意味 Fig. 1-1の設定値 Fig. 1-2の設定値 Fig. 1-3の設定値 Fig. 1-4の設定値
bins ビン(区間)の数 20 30 40 50
density 頻度(False) or 確率(True) False True False True
cumulative 累積度数 False True False True
align ビンの整列 "left" "mid" "right" "mid"

, , , のグラフ
Fig. 1-1

, , , のグラフ
Fig. 1-2

, , , のグラフ
Fig. 1-3

, , , のグラフ
Fig. 1-4

表に記載していない plt.hist() の引数に関しては,下記サイトを確認してください.
Matplotlib公式リファレンス

ヒストグラムを使用する場面は下記の通りです.

  • データ分布の確認 (正規分布かどうか)
  • 外れ値の検出 (裾が長いかどうか)
  • センサ値の確認 (ノイズを把握)
  • 機械学習の前処理 (正規化の判断)

ヒストグラムは,分布の確認 をします.

棒グラフ

棒グラフの描画方法を説明します.
棒グラフとは,

  • カテゴリごとの量の比較 を確認
  • 合計・平均・回数などを表現

するためのグラフです.

具体的な棒グラフは下図の通りです.
棒グラフ

# カテゴリの作成
categorys = ["A", "B", "C", "D"]
# カテゴリに応じた量を作成
quantitys = [ 10,  25,  15,  35]

# 棒グラフの作成
plt.bar(categorys, quantitys)
# グラフにタイトルを追加
plt.title("Bar Graph")
# X軸(横軸)のラベル作成
plt.xlabel("category")
# Y軸(縦軸)のラベル作成
plt.ylabel("quantity")
# グリッドを表示
plt.grid(True)
# 作成したグラフを画面に表示
plt.show()

plt.bar() の概要,引数,戻り値に関して,下表にまとめました.

備考
概要 棒グラフの作成 -
引数 たくさんある 後ほど説明
戻り値 BarContainerオブジェクト 全棒の情報

plt.bar() の引数を下表にまとめる.

引数 意味 備考
x 棒の位置(x座標) 必須の引数
height 棒の高さ(値) 必須の引数
width 棒の太さ デフォルトが0.8
bottom 棒の開始位置 デフォルトが0
align xの位置基準 "center":中央(デフォルト)."edge":枠線

plt.bar() の引数 width, bottom, align の設定値およびグラフを下記に示します.

引数 意味 Fig. 2-1の設定値 Fig. 2-2の設定値 Fig. 2-3の設定値 Fig. 2-4の設定値
width 棒の太さ 0.1 0.5 1.0 1.5
bottom 棒の開始位置 0.0 0.5 1.0 1.5
align xの位置基準 "center" "edge" "center" "edge"

, , のグラフ
Fig. 2-1

, , のグラフ
Fig. 2-2

, , のグラフ
Fig. 2-3

, , のグラフ
Fig. 2-4

横向きの棒グラフを作成する方法を説明します.
plt.barh() を使用することで,横向きの棒グラフとなります.

# カテゴリの作成
categorys = ["A", "B", "C", "D"]
# カテゴリに応じた量を作成
quantitys = [ 10,  25,  15,  35]

# 横向きの棒グラフの作成
plt.barh(categorys, quantitys)
# グラフにタイトルを追加
plt.title("Bar Graph")
# X軸(横軸)のラベル作成
plt.xlabel("quantity")
# Y軸(縦軸)のラベル作成
plt.ylabel("category")
# グリッドを表示
plt.grid(True)
# 作成したグラフを画面に表示
plt.show()

表に記載していない plt.bar() の引数に関しては,下記サイトを確認してください.
Matplotlib公式リファレンス

棒グラフを使用する場面は下記の通りです.

  • カテゴリ別データの比較
  • 頻度・回数の可視化
  • 実験結果の比較
  • ロボット制御パラメータの比較

棒グラフは,データを比較 で使用します.

散布図

散布図の描画方法を説明します.
散布図とは,

  • 2つの変数の関係性 を確認する
  • 相関の有無が一目でわかる

ためのグラフです.

具体的な散布図は下図の通りです.
散布図

# x軸のデータをランダムに作成
x = np.random.rand(100)
# y軸のデータをランダムに作成
y = np.random.rand(100)

# 散布図の作成
plt.scatter(x, y)
# グラフにタイトルを追加
plt.title("Scatter Graph")
# X軸(横軸)のラベル作成
plt.xlabel("X")
# Y軸(縦軸)のラベル作成
plt.ylabel("Y")
# グリッドの表示
plt.grid(True)
# 作成したグラフを画面に表示
plt.show()

plt.scatter() の概要,引数,戻り値に関して,下表にまとめました.

備考
概要 散布図の作成 -
引数 たくさんある 後ほど説明
戻り値 PathCollectionオブジェクト 全点の情報

plt.scatter() の引数を下表にまとめます.

引数 意味 備考
x x軸のデータ 必須の引数
y y軸のデータ 必須の引数
s 点の大きさ "size"でも可能
c 点の色 "color"でも可能
marker 点の形 デフォルトが"o".使用可能なマーカー](https://matplotlib.org/stable/api/markers_api.html)
cmap カラーマップ デフォルトが"viridis"
norm 正規化の方法 linear:線形,log:対数 など
vmin 下限値 -
vmax 上限値 -

plt.scatter() の引数 s, marker, cmap, norm の設定値およびグラフを下記に示します.

引数 意味 Fig. 3-1の設定値 Fig. 3-2の設定値 Fig. 3-3の設定値 Fig. 3-4の設定値
s 点の大きさ 10 20 30 40
marker 点の形 "o" "x" "^" "s"
cmap カラーマップ "viridis" "plasma" "coolwarm" "inferno"
norm 正規化に用いるスケールの種類 "linear" "log" "logit" "linear"

, , , のグラフ
Fig. 3-1

, , , のグラフ
Fig. 3-2

, , , のグラフ
Fig. 3-3

, , , のグラフ
Fig. 3-4

表に記載していない plt.scatter() の引数に関しては,下記サイトを確認してください.
Matplotlib公式リファレンス

散布図を使用する場面は下記の通りです.
データ分析

  • 相関関係の確認
  • 外れ値の検出

機械学習

  • 特徴量の分布確認
  • クラスタ可視化

ロボット/シミュレーション

  • センサデータ可視化
  • 位置・軌道の散布

散布図は,2つの変数の相関・関係性 で使用します.

円グラフ

円グラフの描画方法を説明します.
円グラフとは,

  • 割合・構成比の可視化 をする

ためのグラフです.

具体的な円グラフは下図の通りです.
円グラフ

# カテゴリの作成
categorys = ["A", "B", "C", "D"]
# カテゴリに応じた値を作成
values    = [  1,   2,   3,   4]

# 円グラフの作成
plt.pie(values, labels=categorys)
# グラフにタイトルを追加
plt.title("Pie Graph")
# アスペクト比(縦横比)を同値にして,円を真円とする
plt.axis("equal")
# 作成したグラフを画面に表示
plt.show()

plt.pie() の概要,引数,戻り値に関して,下表にまとめました.

備考
概要 円グラフの作成 -
引数 たくさんある 後ほど説明
戻り値1 各データの情報 リスト型の配列
戻り値2 各ラベルの文字列 リスト型の配列
戻り値3 各数値ラベル リスト型の配列.plt.pie()の引数autopctNoneなら,本戻り値は存在しない

plt.pie() の引数を下表にまとめます.

引数 意味 備考
x 比率データ 必須の引数
labels ラベル -
colos デフォルトがNone
autopct 割合(%)を表示 記載例:"%.1f%%"
デフォルトがNone
pctdistance 割合文字列の中心からの距離 デフォルトが0.6
labeldistance ラベル文字列の中心からの距離 デフォルトが1.1
shadow 影の有無 True:影をつける.False:影をつけない(デフォルト)

plt.pie() の引数 autopct, pctdistance, labeldistance, shadow の設定値およびグラフを下記に示します.

| 引数 | 意味 | Fig. 4-1の設定値 | Fig. 4-2の設定値 | Fig. 4-3の設定値 |
| --- | --- | --- | --- | --- | --- |
| autopct | 割合(%)を表示 | "%.1f%%" | "%.01f%%" | "%.001f%%" |
| pctdistance | 割合文字列の中心からの距離 | 0.5 | 1.0 | 1.5 |
| labeldistance | ラベル文字列の中心からの距離 | 0.1 | 0.6 | 1.1 |
| shadow | 影の有無 | True | False | True |

, , , のグラフ
Fig. 4-1

, , , のグラフ
Fig. 4-2

, , , のグラフ
Fig. 4-3

表に記載していない plt.pie() の引数に関しては,下記サイトを確認してください.
Matplotlib公式リファレンス

円グラフのメリット・デメリットは下記の通りです.
メリット

  • 割合が直感的
  • 構成比の説明に強い
  • 第三者にもわかりやすい

デメリット

  • 要素が多いと見にくい
  • 差が小さいと比較は困難
  • 厳密な比較には不向き

円グラフを使用する場面は下記の通りです.

  • カテゴリ比率
  • 使用割合
  • 構成比の説明
  • 統計の導入図

円グラフは,割合・構成比の可視化 で使用します.

終わりに

本記事では,Matplotlibの様々なグラフ(ヒストグラム・棒グラフ・散布図)に関する以下の内容を説明しました.

グラフ 目的
線グラフ 変化・時系列
ヒストグラム 分布の確認
棒グラフ データを比較
散布図 2つの変数の相関・関係性
円グラフ 割合・構成比

次回予告

第5回では,以下のような「サブプロット(複数グラフの配置)」に焦点を当てます.

  • plt.subplot()plt.subplots() の違い
  • 行列レイアウトでのグラフ配置
  • 複数データを複数視点での同時可視化

複数のグラフを同時可視化 できるようになります.

参考文献

本記事を作成するに当たって参考にしたサイトをまとめました.

Discussion