matplotlibが初心者に分かりにくい理由を考える

久しぶりにmatplotlibを触ったら、やりたい処理がやりづらい……辛い……と改めて悩んでしまった。
matplotlibが分かりにくくて辛い、という理由を考察する記事である。

matplotlibが初心者にとって分かりにくいのはなぜか?

データ分析関連でコーディングをしている中で、pandasやnumpyに関しては、自分の知識の範囲を少しずつであっても広げられている実感がある。 例えば、このブログの過去の記事をいくつか見てみると、以下のような点については分かったぞ、と思える。

このあたりか。やっぱりブログにまとめると知識がしっかり定着するなぁ。
もちろん、pandas/numpyについて全てを知ることは到底無理だ。 しかし、一部については「少なくともこの部分については確固たる知識を習得できた。自分の血肉となった」という自信がある。

でもmatplotlibについては、そうはならない。断片的な知識だけが俺の中にバラバラに存在している。 なぜ知識が断片的になってしまうかというと、

  • 2つのインターフェース
  • ArtistとかFigureとかAxesとかその辺

をまず理解しないと、何も始まらないような感覚がある。
土台が固まっていないところの上に何の知識を積んでも、砂上の楼閣になりそうというか。 賽の河原みたいに、知識をいくら積み重ねたところですぐ吹き飛ばされそうというか。
matplotlibだけは、知識の習得の初手が厳しい……
譬えて言えば、「はい、ここがスタート地点です。先に進むにはまず、この3メートルの壁をよじ登って乗り越えてください。それ以外の方法では次に進めません」みたいな感じ。

そして、たまには「matplotlibの上記の土台を、ちゃんと勉強するか」と一念発起することもある。 3メートルの崖をよじ登って、ArtistとかFigureとかAxesとかその辺を理解しようとするが、それは簡単にいくものではない。と思う。 で、壁からずり落ちてスタート地点から進めない、というのが俺である。

公式ドキュメント

まずは公式ドキュメントを読め。 誰が書いたのか分からない、Qiitaや個人ブログの断片的な記事を読むよりも、まずは公式ドキュメントを読め。 最も頼りになって信用できる資料は公式ドキュメントに決まってるからな。

……ということはよく言われる。俺もそのとおりだと思う。

上記に関するまとまった意見がないかなと思って「公式ドキュメント」でググったら、「自走プログラマー」の抜粋版のサイトがあったので載せておきます。
自走プログラマー【抜粋版】 33:公式ドキュメントを読もう

しかし、matplotlibは公式ドキュメントすら読む気がしないのは、いったい何故なんだろうか?
自分の行動を振り返ってみると、Python本体・pandas・numpy・scikit-learn・seabornは、公式ドキュメントのうち必要なところは読むわ。必要に応じてその都度読んでるわ。
しかしmatplotlib……!
読む……!
読みには行くが分かった気にならない感覚……!
分からない……!
分からないから公式ドキュメントを読みにいかなくなる……!
読みにいかなくなるからますます分からなくなる……!
無限ループ!はまっている、すでに術中……!

なんだか福本伸行っぽくなってしまった。
matplotlibだけは、公式ドキュメントすら読むのを忌避したくなる感覚がある。何故かは分からないけど。「どこに何が書いてあるか」を把握できてないのかな?

英語で書かれたPythonブログでこの辺はどう論じられてきたか

「why matplotlib is hard to understand」とか「matplotlib confusing」とかで検索してみたら、Python関係の英語の技術ブログが見つかった。

Practical Business Python: 「Effectively Using Matplotlib」

Pythonのデータ分析関連ではよく見かける「Practical Business Python」の記事だ。
https://pbpython.com/effective-matplotlib.html

「Why all the negativity towards matplotlib?」の章で、matplotlibが分かりにくい3つの理由が挙げられている。その筆頭が「2つのインターフェース」である。これはもっともだと思う。以下に引用する。

First, matplotlib has two interfaces. The first is based on MATLAB and uses a state-based interface. The second option is an an object-oriented interface. The why’s of this dual approach are outside the scope of this post but knowing that there are two approaches is vitally important when plotting with matplotlib.
The reason two interfaces cause confusion is that in the world of stack overflow and tons of information available via google searches, new users will stumble across multiple solutions to problems that look somewhat similar but are not the same. I can speak from experience. Looking back on some of my old code, I can tell that there is a mishmash of matplotlib code - which is confusing to me (even if I wrote it).

拙訳: 第一に、matplotlibには2つのインターフェースがある。1つ目は、MATLABに基づいた、状態ベースのインターフェースである。2つ目は、オブジェクト指向のインターフェースである。この2つの方法がある理由についてはこの記事が扱う範囲の外であるが、しかしmatplotlibに2つの方法があると知っていることは、matplotlibを使って図を描く上で極めて重要である。
この2つのインターフェースは混乱の元となる。その理由は、StackOverflowがあってグーグル検索をすれば大量の情報が得られる世界で、初心者がある問題に対して複数の解決法を見つけてしまい、それらがある程度似ているのに同じではないからだ。これは私個人の経験からいってもそうだ。私が昔書いたコードを見返すと、(私自身が書いたのに)自分で読んで分かりにくい、ごちゃ混ぜになったmatplotlibコードが確実にあるのだ。

「matplotlibが分かりにくい3つの理由」のうち残りの2つについて。2番目が「デフォルトのスタイルの選択肢の中には、かなり見栄えが悪いものがある(訳注:見た目がきれいでなくて格好悪い、という話)」であった。そして3番めが「図を描くときに、純粋なmatplotlibを使うべきか、pandasやseabornのようなmatplotlibの上層にあるツールを使うべきかに関して分かりにくいこと。」であった。

「分かりにくい理由」を説明した後には具体的なコードを使って書き方の説明をしている。
書き方の説明の部分は、後に改稿してmatplotlibの公式ドキュメントに取り込まれている!
https://matplotlib.org/stable/tutorials/introductory/lifecycle.html

余談であるが、matplotlibに2つの方法がある話は極めて重要である。したがって、matplotlibについてのある程度の量がある記事・本などで、重要な「2つのインターフェース」の話に触れていないものは、matplotlibをロクに分かっていない人が書いたものである可能性が高いと考える。
少なくとも、私が見てきた秀逸な本やネットの記事は、例外なくこの「2つのインターフェース」の話に言及している。

以下の記事も参照。初めて「2つのインターフェース」を俺が知ってビックリしてメモに書いたものだけど。
メモ:Matplotlibのグラフの書き方が2通りある話 - 子供の落書き帳 Renaissance

Real PythonPython Plotting With Matplotlib (Guide)」

Python関係の英語の技術ブログをもう1つ見てみよう。 Real Python による「Python Plotting With Matplotlib (Guide)」という記事である。
https://realpython.com/python-matplotlib-guide/

Why Can Matplotlib Be Confusing?

  1. The library itself is huge, at something like 70,000 total lines of code.
  2. Matplotlib is home to several different interfaces (ways of constructing a figure) and capable of interacting with a handful of different backends. (Backends deal with the process of how charts are actually rendered, not just structured internally.)
  3. While it is comprehensive, some of matplotlib’s own public documentation is seriously out-of-date. The library is still evolving, and many older examples floating around online may take 70% fewer lines of code in their modern version.

拙訳: 1. ライブラリ自体が巨大であり、合計で約70000行もコードがある。 2. matplotlibにはいくつかの異なるインターフェース(図を描く方法)が存在する。少数の異なるバックエンドと相互作用することができる。(バックエンドは内部的な構成だけではなく、どのように図を実際に描画するかという過程も取り扱う。) 3. matplotlibの公式ドキュメントは広範囲にわたるが、その中には非常に古くなったものも存在する()。このライブラリは今も進化を続けていて、ネット上に出回っている古い例の中には、新しいバージョンのコードで書き直せば行数が70%少なくなるものもある。

matplotlibって実は変化が激しいのか? あんまりそんな印象は無いんだけど。

stackoverflow: 「Understanding matplotlib: plt, figure, ax(arr)?」

https://stackoverflow.com/questions/35677767/understanding-matplotlib-plt-figure-axarr

Understanding matplotlib: plt, figure, ax(arr)?

The matplotlib documentation is rather confusing to me. When one searches something really specific, like rescaling a legend, different plot markers and colors and so on the official documentation is really precise but rather general information is not that good in my opinion. Too much different examples, no real explanations of the purposes...looks more or less like a big listing of all possible API methods and arguments.

拙訳:matplotlibのドキュメントは、私にとってかなり分かりにくいです。本当に具体的なものを検索するとき、例えば凡例を拡大縮小するとか、プロットのマーカーや色を変えるとかですが、公式ドキュメントは非常に正確です。しかしもっと一般的な情報については私の意見ではそれほど良いものではありません。あまりにも多くの異なる例があって、その目的の説明も無いのです。まるで、全部のAPIのメソッドと引数を巨大な一覧表にしたように見えます。


っていう感じで「やっぱmatplotlibは知識習得しづらいわ」と悩む記事でした。いつかは「matplotlibの根幹をちゃんと理解したわ」っていう記事が書ければ良いんだけど、いつになることやら。

再度書いておくけど、知らなかった人は「matplotlibに2つのインターフェースがある」ことだけは覚えて帰ったほうが良いと思います!

linus-mk.hatenablog.com