やりたいこと
こんな感じで、幅違いのsubplotを好みの間隔でプロットできるようにしたい。
結論
plt.subplots()
の gridspec_kw
なる引数 で一発解決!
説明
余白を調整しつつ幅や高さの違うsubplotを作るには、例えば@simonritchie様のQiita記事で紹介されているようにGridSpec()
を使えばよいです。公式ユーザーガイドもほぼ同じ方法を紹介しているようです。
ただし、これらの記事では複雑なレイアウトの図を作っていて、結構記述量の多い処理になっています。ただ単に比率が違うだけの図を作りたいだけなのに、同じような処理を書くのは結構面倒です。「もっと簡単な方法ないかなー」と思って、何気なく plt.subplots()
の引数を眺めていたら見つけました。gridspec_kw
です!いかにもですね!
plt.subplots()
が内部的に GridSpec()
を呼んでいて、そのときに食わせる引数が指定できるパターンです。しめしめ。
公式API で GridSpec
の引数を調べてやると、幅/高さの調整はwidth_ratios
/height_ratios
で、横/縦の間隔の調節はwspace
/hspace
でやるらしいことがわかります。
ということで、gridspeck_kw
にこれらの値を指定する辞書を食わせればOKです!
もちろん sharex
/sharey
といったplt.subplots()
の他の引数とも併用可能です。
import matplotlib.pyplot as plt
fig, axes = plt.subplots(
3, 2, # 縦 x 横
gridspec_kw=dict(width_ratios=[1,5], height_ratios=[1,4,4], wspace=0.1, hspace=0.3), # 今回のミソ
sharex='col', sharey='row', figsize=(6, 7) # もちろん他の引数と併用可
)
## ところで、なんで subplotsの順番は nrows x ncolなのに、figsizeは (横, 縦) なんだろう?
あとは手に入れた axes
に対してお好みのプロット操作をするだけです。
(ちなみに、「左上のaxいらん」という場合には fig.delaxes(axes[0][0])
です。)
以上です。最後まで読んで下さりありがとうございました!
追記:
記事中で述べた公式ユーザーガイドの一節にも、gridspeck_kwについての言及がありましたことを補足させていただきます。
また、同様の方法は他の記事でも既に紹介されていたのを見つけたので、参考としてリンクを貼ります。
https://stackoverflow.com/questions/10388462/matplotlib-different-size-subplots