matplotlibとグラフ作成の2つの流儀


はじめに

pythonでグラフを描画する際の定番ともいえるライブラリmatplotlibですが、仕組みがよく分からず雰囲気で使ってしまっていた(そのせいでグラフを描くのにすごく時間がかかっていた)ので、いろいろ調べてようやく仕組みが分かりました。
その概要を備忘録を込めて簡単にまとめておきたいと思います。
一番下に参考にさせて頂いたページを載せておきます。

matplotlibでのグラフ作成の仕組み

matplotlibでは、グラフの台紙や描画領域など、「グラフの入れ物」になる部分をオブジェクトとして扱い、このオブジェクトの中にグラフの線や点、あるいは凡例といった装飾品などの要素を追加していくことでグラフを作成していく、という仕組みになっています。

グラフを作成する際は、まず台紙部分やグラフの描画領域となるオブジェクトを生成し、オブジェクトに対して必要な要素(例えばグラフの線など)を追加していきます。オブジェクトにグラフの要素を追加していく操作は、オブジェクトに付随したメソットで行うことができます。

グラフの入れ物として作成するオブジェクトとしては、グラフの台紙部分であるFigure、グラフの描画領域であるAxes、そしてグラフの軸部分であるAxisがあります。(Tickというのもあるみたいですが一旦無視します)

  • Figure : グラフの台紙(一番外側)部分のオブジェクト
  • Axes : グラフの描画する領域のオブジェクト
  • Axis : グラフの軸を表すオブジェクト。x軸とy軸でそれぞれXAxisとYAxisという。

上のオブジェクトは下記のように階層構造をもっています。つまり、最も外側にグラフの台紙があり、次にグラフの描画領域があり、さらにその内部にグラフの軸を表す部分があるということですね。

オブジェクトの階層構造
Figure
 └ Axes
      └ XAxis
      └ YAxis
      └ Tick

グラフ描画の流儀

matplotlibでグラフを描画する際のコードの書き方としては、「オブジェクト指向スタイル」と「MATLAB」の2つの流儀があります。

オブジェクト指向スタイルの流儀は、先ほど上に記載したオブジェクト(台紙、描画領域など)を自分で生成し、そのオブジェクトに対して要素(グラフの点など)を追加していく方法でグラフを作成する方法です。

オブジェクト指向スタイル
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()          # figureオブジェクトを作成
ax = fig.add_subplot(111)   # Axesオブジェクトを作成(Axisも一緒にできる)

x = np.linspace(-3, 3, 100)
y = np.exp(x)

ax.plot(x, y)  # Axesオブジェクトにグラフの線を追加
plt.show()     # グラフを描画

そして、MATLABの流儀は、グラフを描画する際の記述を全て「plt.xxxxx」のように書く方法です。オブジェクト指向スタイルでは、FigureやAxesといったオブジェクトを自分で生成していましたが、MATPLAB流では自動で生成してくれます。

MATLAB流
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 100)
y = np.exp(x)

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

上のコードを実行すると、グラフはこんな感じでできます。

どちらの流儀を使うか

いろいろ調べてみると、MATPLAB流は簡単にグラフが作れる一方、細かな装飾など微調整ができないため、できればオブジェクト指向スタイルに慣れておくほうが良いという意見が多かったです。

たしかにそうだなあと思いました。また、オブジェクト指向スタイルは、「グラフの外側をオブジェクトとして作成し、その中に要素を付け加えていくことでグラフを描画する」というmatplotlibの仕組みに則っていてわかりやすいです。初めに台紙を作ってプロットしていくという、実際に紙の上でグラフを描く場合と工程が同じだということもあり、やっていることがイメージしやすいので、個人的にもオブジェクト指向スタイルのほうが好みではあります。

参考

下記を参考にさせて頂きました。とても参考になりました、ありがとうございます。
早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話
pythonのmatplotlibの使い方をまとめてみた
matplotlib の2つの流儀( MATLAB・オブジェクト指向スタイル)