matplotlibのsubplotはもうやめたい その２

Matplotlibのsubplotが使いにく過ぎて、はるか昔にこんな記事を書いた。https://qiita.com/ponnhide/items/fb375a610e4a9c0f743a
今回はその記事の続きで、subplot用の新しいツールをつくってみたという話。

# Matplotlibのsubplotは使いにくい
正直言って、Matplotlibのsubplotは依然として使いにくい。僕はmatplotlibの自由度の高さが好きで、どれだけggplotを布教されてもmatplotlibを使い続けているのだけど、subplot周りの実装は真面目に微妙だと思う。そして、この点は他の人からも指摘がなされ、改善が求められている。

- https://twitter.com/kasparmartens/status/1381991445381406722?s=20
- https://github.com/has2k1/plotnine/issues/46

これらの要望に対する返しとして、最近matplotlibはある機能を実装してくれた。それが [subplot_mosaic](https://matplotlib.org/stable/tutorials/provisional/mosaic.html#sphx-glr-tutorials-provisional-mosaic-py)  である。実際、これは素晴らしい機能なので興味を持った人はlinkからdocumentを読んでみてほしい。[grid_spec](https://matplotlib.org/stable/api/_as_gen/matplotlib.gridspec.GridSpec.html)よりは断然つかいやすいはずだ。しかし、結局のところgrid_specを使いやすくしてくれただけで、subplotの根本的な使いにくさは依然として何も解決されていない。。。。

matplotlibのsubplotの使いにくさ、それは、**「複数グラフのレイアウト最初に決めなければならないところ」** だ。そして残念なことに、matplotlibの開発者達はこの問題に気付いていないように思う。。。。だから、先の[document](https://matplotlib.org/stable/tutorials/provisional/mosaic.html#sphx-glr-tutorials-provisional-mosaic-py)にも以下の様なことを書いてしまうのだ。

_This interface naturally supports naming your axes. Figure.subplot_mosaic returns a dictionary keyed on the labels used to layout the Figure. By returning data structures with names, it is easier to write plotting code that is independent of the Figure layout.
This is inspired by a proposed MEP and the patchwork library for R._

これ書いた人、patchwork使ったことないのかな。。。。ggplotのライブラリである[patchwork](https://github.com/thomasp85/patchwork)や[cowplot](https://github.com/wilkelab/cowplot)の良いところはFigureのレイアウトを簡単に定義できるところではなくて、個別のグラフを作った後に、レイアウトを自由に決められるところなのに、、、
せっかくJupyter notebookを使ってinteractiveな解析ができるのに、何が楽しくして、最初にFigureのレイアウトを決めるなんていう縛りプレイをさせられなきゃならないんだ?。もし、個別のグラフを作ったあとにレイアウト変えたいなって思ったらどうすんだし！！！。最初からやり直すのか？。　Jupyter上で色々なレイアウトを逐次的に試せたほうが良くない？

ということで、matplotlibのための[patchwork](https://github.com/thomasp85/patchwork)っぽいツール、[patchworklib](https://github.com/ponnhide/patchworklib)を作ってみた。4年前の記事で紹介したものよりは遥かに実用的なものになったように思う。

# patchworklib
以下のような感じ図のが簡単に作れるようになっているはず。。。
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167957/a9383b74-240c-0fd1-8a54-9b25f229aaf6.png)


### インストール
installは
`git clone https://github.com/ponnhide/patchworklib.git`
でgithubのレポジトリをクローンしてもらって、
`python setup.py install`
できるず。

### 使い方
利用法は至ってシンプル。matplotlibの`matplotlib.axes.Axes class`のsubclassとして実装された`Brick class`のobjectを`'|'`と`'/'`演算子でくっつけてやれば、簡単に様々なレイアウトを試すことができる。
当然、`matplotlib.axes.Axes class`で使えるmethodは全て使うことができる。また、より柔軟なレイアウトを可能にするためにグラフの大きさ （厳密にはアスペクト比） を変更する　`change_aspectratio()`　と legendの位置を後から変更できる `move_legend()` が Brick classの固有のmethodとして実装されている。
~~詳細な使い方は後日に追記予定。~~  こちらの記事を見てください-> https://qiita.com/ponnhide/items/e288a46f4ee669c25a02
一応、以下のjupyter notebookの中のExample codesを見てもらえれば使い方は分かるようになっていると思う。
- https://github.com/ponnhide/patchworklib/blob/main/example/tutorial.ipynb
- https://github.com/ponnhide/patchworklib/blob/main/example/tutorial2.ipynb 

以下のGoogle colabのlinkから実際に実行して試してみることも可能。
- [tutorial1](https://colab.research.google.com/drive/1TVcH3IJy6geDXVJDfOKCPFPsP2GzjxHu?usp=sharing)
- [tutorial2](https://colab.research.google.com/drive/142gBg6Q8hRWTw95yqM5G_P4E2T5pDLrX?usp=sharing)