テクノロジー

2024年11月15日

Matplotlibとは

Matplotlibは、2次元や3次元のデータを使って、折れ線グラフや棒グラフ、円グラフなどさまざまなグラフを描画し、データを可視化するためのライブラリです。

著者プロフィール

IT分野における教育の先駆者として、多くのエンジニアを育成するプログラミングスクールの運営、Web開発やAI研修を行なっています。幅広いレベルの受講生に対して実践的なスキルを提供。生徒の成長を第一に考え、効果的で魅力的な教育プログラムの設計に情熱を注いでいます。

ゴール

  • Matplotlibの特徴と基本的な使い方を理解する

Matplotlibとは

Matplotlibは、2次元や3次元のデータを使って、折れ線グラフや棒グラフ、円グラフなどさまざまなグラフを描画し、データを可視化するためのライブラリです。
Matplotlibでグラフをビューする際のコードの書き方は、MATLABスタイルとオブジェクト指向スタイルの2種類があります。

MATLABスタイル

MATLABスタイルの書き方は、後述するオブジェクト指向スタイルに比べて柔軟性が劣りますが、簡単なグラフを素早く描画する際に便利です。
以下は、MATLABスタイルを使用した場合のコード例です。

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [2, 4, 6]

plt.plot(x, y)
plt.show()

[実行結果]

Image from Gyazo

コードの詳しい内容については後ほど説明しますので、ここでは、オブジェクト指向スタイルとの書き方をなんとなくイメージする程度で問題ありません。

次に、オブジェクト指向スタイルの書き方についても見てみましょう。

オブジェクト指向スタイル

オブジェクト指向スタイルでは、描画オブジェクトFigureオブジェクト)と呼ばれるグラフを描画する大枠を用意し、その中にサブプロットAxesオブジェクト)と呼ばれるグラフを描画する領域を追加します。
そして、追加したサブプロットに対して、どのようなデータを使用するかやどのグラフで描画するかなどを指定します。

Image from Gyazo

このように、描画オブジェクトとサブプロットが分離していることで、一度に複数のグラフを描画できます。
以下は、先ほどMATLABスタイルで描いたグラフをオブジェクト指向スタイルで描画した場合のコード例です。

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [2, 4, 6]

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

本テキストでは複雑なグラフも描けるよう、オブジェクト指向スタイルの書き方で解説します。

Matplotlibのインポート

Matplotlibを使用するには、初めにインポートしておく必要があります。
Matplotlibをインポートするには、以下のようにコードを記述し、実行します。

import matplotlib.pyplot as plt

描画オブジェクトとサブプロットの役割

サブプロットは、グラフを描画するフィールドのことで、一度に複数同時に描画することも可能です。
また、描画オブジェクトは、サブプロット上に描かれる折れ線グラフや棒グラフといったオブジェクトを指します。

先ほどオブジェクト指向スタイルの説明で例に挙げたコードを改めて確認してみましょう(Matplotlibをインポートする記述は省略しています)。

x = [1, 2, 3]
y = [2, 4, 6]

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

plt.subplots()が呼ばれると、1つの描画オブジェクトと1つのサブプロットが生成されます。
生成された描画オブジェクトとサブプロットはそれぞれ変数figaxに代入されます。
この時点で、plt.show()を実行すると以下のようなグラフが描画されます。

x = [1, 2, 3]
y = [2, 4, 6]

fig, ax = plt.subplots()
plt.show()

[実行結果]
Image from Gyazo

この時点では、サブプロットに何も値を指定していないので、描画オブジェクトとサブプロットのみが表示されます。

次の行のax.plot(x, y)でサブプロットに使用する値を追加しています。
この場合、X軸が1, 2, 3、Y軸が2, 4, 6のグラフが描かれるよう指定しています。
最後にplt.show()で定義したグラフを描画させています。

Image from Gyazo

ちなみにplt.show()を省略してもグラフ自体は描画できますが、オブジェクト名も余計に出力されます。

Image from Gyazo

また、実行環境やバージョンによってグラフがうまく出力されない場合があるので、基本的にはplt.show()を使ってグラフを描画するようにしましょう。

グラフを複数描画する方法

ここまでは、1つのグラフのみを描画する方法について説明してきました。
今度は、2つのグラフを描画する方法について説明します。
ここでは、グラフの描画で使用する値として、2組の変数を用意します。

x1 = [1, 2, 3]
y1 = [2, 4, 6]
x2 = [1, 2, 3]
y2 = [-2, -4, -6]

次にサブプロットを2つ用意します。
サブプロットを複数使用する場合は、plt.subplots()の引数にサブプロットの数を指定します。
ここでは、サブプロットを2つ使いたいので、2を指定します。

x1 = [1, 2, 3]
y1 = [2, 4, 6]
x2 = [1, 2, 3]
y2 = [-2, -4, -6]

fig, axes = plt.subplots(2)

この時点でplt.show()を実行すると、2つのサブプロットが描画されます。

Image from Gyazo

それでは、それぞれのサブプロットに描くグラフの値を指定しましょう。
変数axesには、2つのAxesオブジェクト(サブプロット)が格納されており、インデックスを指定することで特定のAxesオブジェクトを取得できます。
それぞれのAxesオブジェクトに対してグラフで使用する値を設定します。
最終的に以下のコードが出来上がります。

x1 = [1, 2, 3]
y1 = [2, 4, 6]
x2 = [1, 2, 3]
y2 = [-2, -4, -6]

fig, axes = plt.subplots(2)
axes[0].plot(x1, y1)
axes[1].plot(x2, y2)
plt.show()

[実行結果]

Image from Gyazo

この他にも、行と列を指定することでサブプロットのレイアウト構造を指定できます。
以下は、2行2列のレイアウト構造でサブプロットを描画する場合の例です。

fig, ax = plt.subplots(2, 2)
plt.show()

Image from Gyazo

また、行数と列数はnrowsncolsというパラメータでも指定できます。
以下は、1行2列のレイアウトでサブプロットを描画する場合の例です。

fig, ax = plt.subplots(ncols=2)
plt.show()

Image from Gyazo

nrowsncolsのデフォルト値は1が設定されているため、上記のようにnrowsに値を指定しない場合は1が指定されます。

書式設定の基本

ここでは、グラフのスタイルやタイトル、凡例といった書式設定について説明します。

表示スタイル

matplotlib.styleというモジュールを使用することで、グラフの表示スタイルを変更できます。
matplotlib.styleを使用するには、事前にインポートしておく必要があります。

import matplotlib.style

以下のコードを実行することで、利用可能なスタイル一覧を表示できます。

matplotlib.style.available

[実行結果]

['Solarize_Light2',
 '_classic_test_patch',
 'bmh',
 'classic',
 'dark_background',
 'fast',
 'fivethirtyeight',
 'ggplot',
 'grayscale',
 'seaborn',
 'seaborn-bright',
 'seaborn-colorblind',
 'seaborn-dark',
 'seaborn-dark-palette',
 'seaborn-darkgrid',
 'seaborn-deep',
 'seaborn-muted',
 'seaborn-notebook',
 'seaborn-paper',
 'seaborn-pastel',
 'seaborn-poster',
 'seaborn-talk',
 'seaborn-ticks',
 'seaborn-white',
 'seaborn-whitegrid',
 'tableau-colorblind10']

試しに、いくつかスタイルを変更してみましょう。
以下のようにmatplotlib.styleuse関数を使って、引数に指定したいスタイルを指定することで、スタイルを変更できます。

[seabornスタイルを指定した場合]

matplotlib.style.use('seaborn')

x = [1, 2, 3]
y = [2, 4, 6]

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

[実行結果]

Image from Gyazo

[dark_backgroundスタイルを指定した場合]

matplotlib.style.use('dark_background')

x = [1, 2, 3]
y = [2, 4, 6]

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

[実行結果]

Image from Gyazo

タイトル

描画オブジェクトとサブプロットにはそれぞれタイトルを設定できます。
描画オブジェクトにタイトルを設定する場合はsuptitleメソッドを使用し、サブプロットごとにタイトルを設定する場合はset_titleメソッドを使用します。

x1 = [1, 2, 3]
y1 = [2, 4, 6]
x2 = [1, 2, 3]
y2 = [-2, -4, -6]

fig, axes = plt.subplots(1, 2)
axes[0].plot(x1, y1)
axes[1].plot(x2, y2)
axes[0].set_title('Subplot1 title')
axes[1].set_title('Subplot2 title')
fig.suptitle('Graph title')
plt.show()

[実行結果]

Image from Gyazo

(実行するエディタの設定等によって描画が横並びや縦並びになる場合があります。)

軸ラベル

グラフのX軸とY軸にそれぞれラベルを設定する方法について説明します。
X軸にラベルを設定する場合はset_xlabelメソッド、Y軸にラベルを設定する場合はset_ylabelメソッドを使用します。
ここでは、X軸にX label、Y軸にY labelと表示させてみましょう。

x = [1, 2, 3]
y = [2, 4, 6]

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('X label')
ax.set_ylabel('Y label')
plt.show()

[実行結果]

Image from Gyazo

凡例

凡例を表示させるには、plotメソッドでサブプロットに値を設定する際にlabelパラメータを使って表示させる凡例名を設定します。
ここでは、sample legendという名前で凡例名を指定してみましょう。

x = [1, 2, 3]
y = [2, 4, 6]

fig, ax = plt.subplots()
ax.plot(x, y, label='sample legend')
ax.legend()
plt.show()

[実行結果]

Image from Gyazo

ax.legend()で凡例を出力させています。

legendメソッドでは、locパラメータを指定することで凡例の表示位置を指定できます。
例えば、凡例を右下に表示させたい場合は、locパラメータにlower rightを指定します。

x = [1, 2, 3]
y = [2, 4, 6]

fig, ax = plt.subplots()
ax.plot(x, y, label='sample legend')
ax.legend(loc='lower right')
plt.show()

[実行結果]

Image from Gyazo

以下の表は、locで指定可能な値の一例です。

表示位置
best グラフとの重なりが最小となる位置
upper left 左上
lower right 右下
center 上下左右中央
center left 上下中央左寄り
centor low 左右中央上寄り

また、bbox_to_anchorパラメータを使用することで、座標を指定できます。
bbox_to_anchorの指定方法については、公式ドキュメントを確認しましょう。
bbox_to_anchor

まとめ

  • Matplotlibの記法には、MATLABスタイルとオブジェクト指向スタイルの2種類が存在する。
  • MATLABスタイルは、簡易なグラフを瞬時に描画したい場合に適しており、オブジェクト指向スタイルは、より複雑なグラフの描画に適している。
  • オブジェクト指向スタイルの場合、描画オブジェクトとサブプロットが分離していることで、一度に複数のグラフを描画できる。
  • Matplotlibは、書式設定に関するさまざまな関数やメソッド、パラメータを用意している。

公式ドキュメント・参考情報

1. bbox_to_anchor

ダイビックのことをもっと知ってみませんか?