matplotlibにおける2つのグラフ作成スタイル【Python】

matplotlibのグラフを描画する代表的な方法をここで解説していきます。

[toc]
目次

matplotlibにおけるグラフの構造

matplotlibのグラフは、FigureオブジェクトとAxesオブジェクトによって構成されます。それぞれのオブジェクトのイメージは次のようなものです。

  • Figureオブジェクト:グラフを描く領域を表すオブジェクト(=描画領域)
  • Axesオブジェクト:グラフ自体を表すオブジェクト

下図のようにFigureオブジェクトにAxesオブジェクトを配置し、それぞれを修飾することでグラフを作成します。なお、AxesオブジェクトはFigureオブジェクトに複数配置することも可能です。

matplotlibでグラフを描く2つのスタイル

pyplot スタイル

オブジェクトを意識せずに関数を用いてグラフを出力します。MATLABでのグラフ作成に近く、対話環境での簡易的なグラフ作成に適しています。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-3, 3, 0.1)
y = np.sin(x)

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

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

Figureオブジェクト、Axesオブジェクトを1つ1つ作成して、グラフを作成します。コードはやや冗長になりますが、複雑な設定が可能になります。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-3, 3, 0.1)
y = np.sin(x)

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

これにより以下のグラフが描画されます。

なお、pyplot スタイルとオブジェクト指向スタイルについてはともに公式ドキュメントでも説明されています。(→こちら)

以下で、それぞれのスタイルの詳細を見ていきます。

pyplot スタイル

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-3, 3, 0.1)
y = np.sin(x)

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

この時の処理は次のようになります。

  1. plot関数により、暗黙的にFigureオブジェクトとその中にAxesオブジェクトが生成される。さらに、Axesオブジェクトに引数で指定されたプロットが描画される。
  2. show関数によりアクティブな描画領域(=先ほど作成されたFigureオブジェクト)を可視化する。

この方法はMATLABにおけるグラフ作成を模したスタイルで、簡単なコードでグラフを書くことができ、対話環境などで簡易的にグラフ作成する場合に適しています。
しかし、FigureオブジェクトやAxesオブジェクトを明示的に変数としては保持しないので、複数のFigureオブジェクトやAxesオブジェクトが存在する場合は扱いにくくなってしまいます。具体的には、1つのグラフしかない場合はpyplot スタイルで問題ないですが、複数のグラフを並べて表示するような場合は、オブジェクト指向スタイルの方が書きやすいかもしれません。

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

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-3, 3, 0.1)
y = np.sin(x)

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

この方法では、Figureオブジェクト、Axesオブジェクトを変数として格納しているので、複数のFigureオブジェクトやAxesオブジェクトがある場合でも、明示的に「どのAxesオブジェクトに対して処理を行うか」を指定することができます。このため、複雑なグラフでもオブジェクトごとにプロパティを設定することができ、また、Axesオブジェクトが増えてもそれぞれのオブジェクトを組み合わせていくだけでグラフを作ることができるようになります。

なお、FigureオブジェクトとAxesオブジェクトは以下のようsubplots関数を用いることで、同時に生成することも可能です。

x = np.arange(-3, 3, 0.1)
y = np.sin(x)

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

スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

19 − eighteen =

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次