メモ:Matplotlibのグラフの書き方が2通りある話

概要

Matplotlibのインターフェースには2通りある。MATLABに近い書き方と、オブジェクト指向のインターフェースである。公式は後者を推奨している。

私も昨日知ったばかりでまだまだ詳しくない。メモ程度に書いておくので、詳細は参考文献などを見てほしい。

参考文献

まずは公式ドキュメントを示したほうが良いだろう。
https://matplotlib.org/tutorials/introductory/lifecycle.html#a-note-on-the-object-oriented-api-vs-pyplot

Pythonデータサイエンスハンドブック」の「4.2 同じ結果を得る2つのインターフェース」に載っている。
この本は英語版が無料で公開されているおり、該当箇所は以下である。
Visualization with Matplotlib | Python Data Science Handbook

Pythonによるデータ分析入門 第2版」にも「9.1.3 目盛り、ラベル、凡例」のところに記述がある。ただし1ページ足らずしかないので、「Pythonデータサイエンスハンドブック」のほうを勧める。

ネット上で読める日本語のだと、以下の2つが良さそう。
早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiita
matplotlib入門 - りんごがでている の「オブジェクト指向なプロット」部分

呼び方の対応表

公式に定まった呼び方が無いようので、本や記事によって微妙に違う言葉で表現されてたりする。

オブジェクト指向インターフェース MATLABスタイルインターフェース
pyplotインターフェース(出典)
OOP-style(出典、p.252) MATLAB-style(出典、p.252)
explicit interface(出典 implicit interface(出典

以下で2つのインターフェースのそれぞれについて書く。

MATLABスタイルインターフェース

pyplotを用いたインターフェースで、状態ベースである。MATLABに近い書き方。
端的に言うと、import matplotlib.pyplot as pltをしたあとでplt.xxxによってグラフを描いていくやり方のこと。

重要なのは、plt.xxxは「今描いている図」に対する操作になっていることである。これは明示的に指定しなくても良いので、簡単な図をサッと作りたいときには便利。

plt.gcf() (get current figure)とplt.gca() (get current axes)を使うと、現在のFigureオブジェクトやAxesオブジェクトを取得できる。

オブジェクト指向インターフェース

FigureオブジェクトやAxesオブジェクトに対するメソッドを使う方法のこと。
端的に言うと、fix, ax = plt.subplots()とした上でax.xxxによってグラフを描いていくやり方のこと。

どっちが良いの

Matplotlib公式より

Note
In general, try to use the object-oriented interface over the pyplot interface.

https://matplotlib.org/tutorials/introductory/lifecycle.html#a-note-on-the-object-oriented-api-vs-pyplot

公式の別のページからもう1箇所。

Note
the pyplot API is generally less-flexible than the object-oriented API. Most of the function calls you see here can also be called as methods from an Axes object. We recommend browsing the tutorials and examples to see how this works.

https://matplotlib.org/tutorials/introductory/pyplot.html

Matplotlib公式は、一般的にオブジェクト指向インターフェースの方が良いとしている。

Pythonデータサイエンスハンドブック」より

こうした状態を持つインターフェース(注:MATLABスタイルのこと)は、簡単なプロットでは高速かつ便利ですが、問題に陥りやすいものでもあります。
(前掲書、225ページ)

より単純なプロットでは、使用するスタイルの選択は単に好みの問題ですが、プロットが複雑になるにつれてオブジェクト指向のアプローチが必要になります。
(前掲書、226ページ)

簡単なグラフを書く際にはMATLABスタイルでもよいが、いろいろと見た目を調整しようとするとオブジェクト指向のスタイルのほうが良いみたい。 それでは。