11
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

matplotlibのサブプロットの比率・間隔を一発で調節する

Last updated at Posted at 2019-10-06

やりたいこと

こんな感じで、幅違いのsubplotを好みの間隔でプロットできるようにしたい。
gridspec_kw.png

結論

plt.subplots()gridspec_kw なる引数 で一発解決!

説明

余白を調整しつつ幅や高さの違うsubplotを作るには、例えば@simonritchie様のQiita記事で紹介されているようにGridSpec()を使えばよいです。公式ユーザーガイドもほぼ同じ方法を紹介しているようです。

ただし、これらの記事では複雑なレイアウトの図を作っていて、結構記述量の多い処理になっています。ただ単に比率が違うだけの図を作りたいだけなのに、同じような処理を書くのは結構面倒です。「もっと簡単な方法ないかなー」と思って、何気なく plt.subplots() の引数を眺めていたら見つけました。gridspec_kw です!いかにもですね!

plt.subplots() が内部的に GridSpec() を呼んでいて、そのときに食わせる引数が指定できるパターンです。しめしめ。

公式APIGridSpecの引数を調べてやると、幅/高さの調整はwidth_ratiosheight_ratiosで、横/縦の間隔の調節はwspacehspaceでやるらしいことがわかります。

ということで、gridspeck_kw にこれらの値を指定する辞書を食わせればOKです!
もちろん sharexsharey といった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

11
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?