こんにちは、グロースハッカーの たぬ ( @tanuhack )です。
matplotlib にはplt.**plot
でグラフを作成する MATLAB スタイル とax.**plot
でグラフを作成する オブジェクト志向スタイル の2つの流儀が存在します。
matplotlib でグラフを作成することが難しく感じるのは、流儀の存在を知らないままプログラムを書いていて、2つのスタイルが混在して可読性が著しく低下するからだと思っています。
実際に、この両者の違いを正しく理解していないまま、無責任に紹介している書籍や記事、動画があまりにも多いです…。
先に結論を言いますが、matplotlib でグラフを作るときは オブジェクト指向スタイル の書き方に統一することをオススメします。
理由は、matplotlib のラッパーである pandas のdf.**plot
や seaborn のsns.**plot
などがオブジェクト指向スタイルであることと、レイアウトの微調整が MATLAB スタイルだと難しいからです。
BOUL’TECH では全ての記事で オブジェクト指向スタイル の書き方で統一しています。
MATLAB スタイル
MATLAB スタイルは、plt.**
で全部済ませる流儀です。
import matplotlib.pyplot as plt
# 折れ線グラフを描画
plt.plot([1, 2, 4, 8])
MATLAB スタイルでは、 暗黙的 にFigure
オブジェクトとAxes
オブジェクトを作成し、グラフを描画します。
明示的に変数を保持しないので、視覚化を意識したグラフを作るような細かな調整ができません。サクっと可視化することが目的ならこの方法でも問題ありません。
オブジェクト指向スタイル
オブジェクト指向スタイルは、明示的にFigure
オブジェクトとAxes
オブジェクトを作成し、グラフを描画する流儀です。
import matplotlib.pyplot as plt
# 図、座標軸を明示的に定義して、折れ線グラフを描画
fig, ax = plt.subplots()
ax.plot([1, 2, 4, 8])
Figure
オブジェクト、Axes
オブジェクトを変数として格納しているので、どの箇所にどういう処理を施したか分かりやすいです。
例えば、オブジェクト指向スタイルで以下のような装飾を施したい場合、こんな感じでプログラムを書くことができます。
- 不要な枠線(
Spines
)を消す - x軸の目盛りの間隔(
Tick Locators
)を 0.5 の倍数から 1 の倍数に変更する - グリッド線(
Grid
)を表示する
+ import matplotlib as mpl
import matplotlib.pyplot as plt
# 図、座標軸を明示的に定義して、折れ線グラフを描画
fig, ax = plt.subplots()
ax.plot([1, 2, 4, 8])
+ # 上と右の枠線を消す
+ [ax.spines[i].set(visible=False) for i in ['top', 'right']]
+ # x軸の目盛りの間隔を 1の倍数 にする
+ ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
+ # グリッド線を表示する
+ ax.grid(ls=':', lw=1, c='#CDCDCD')
コメント