matplotlibの多くのサブプロットでサブプロットのサイズ/間隔を改善する


313

この質問に非常に似ていますが、私の図は必要なだけ大きくすることができます。

matplotlibで縦に積み上げたプロットの束全体を生成する必要があります。結果はfigsaveを使用して保存され、Webページに表示されるため、サブプロットが間隔をあけてオーバーラップしない限り、最終的な画像の高さが気になりません。

図をいくら大きくしても、サブプロットは常に重なり合っているように見えます。

私のコードは現在次のようになります

import matplotlib.pyplot as plt
import my_other_module

titles, x_lists, y_lists = my_other_module.get_data()

fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
    plt.subplot(len(titles), 1, i)
    plt.xlabel("Some X label")
    plt.ylabel("Some Y label")
    plt.title(titles[i])
    plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)

回答:


413

使ってみてください plt.tight_layout

簡単な例として:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4)
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

タイトなレイアウトなし

ここに画像の説明を入力してください


タイトなレイアウトで ここに画像の説明を入力してください


21
プロットコードの後で、show()の直前にこれを実行する必要があることを示すと、少しわかり
やすくなります

5
tight_layout()ヒットとミスです。私はそれが何の効果もない(大きなプロット間マージンが残っている)とき何が違うのかを理解しようと努めてきました-これはしばしばです
javadba

3
これは、図のタイトル(suptitle)とサブプロットのタイトルを重ね合わせたことを除いて、私にとってはかなりうまくいきました。誰かが同様の問題に遭遇した場合に備えて、私の場合に役立つのは以下のとおりです。つまり、rectパラメーターtight_layout()
Siyana Pavlova

284

を使用plt.subplots_adjustして、サブプロット(ソース)間の間隔を変更できます。

呼び出し署名:

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

パラメータの意味(および推奨されるデフォルト)は次のとおりです。

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for blank space between subplots
hspace = 0.2   # the amount of height reserved for white space between subplots

実際のデフォルトはrcファイルによって制御されます


3
私はhspaceをいじってみましたが、それを増やすと、オーバーラップの問題を解決せずにすべてのグラフを小さくするだけのようです。他のパラメーターも試してみましたが、左、右、下、上で実際に何が指定されているのかわかりません。
mcstrother

52
@mcstrotherプロットを表示した後で「調整」ボタンをクリックすると、これらのパラメーターの6つすべてをインタラクティブに変更でき、機能するものが見つかったらコードにコピーします。
Nick T

1
調整ボタンが表示されません。私はJupyterノートブックにいますが。%matplotlibインラインと%matplotlibノートブックを試してみました。
Matt Kleinsmith、2018

1
@MattKleinsmith:調整ボタンにはホバーテキスト「Configure subplots」があり、ノートブック以外の通常のMatplotlibの使用で表示されます。これは、「フロッピーディスク」の保存ボタンの左側にあるボタンです。pythonspot - 9329.kxcdn.com / wp - content / uploads / 2016/07 / -ボタンは、使用しているウィンドウシステムによって異なります。使用していますが、常に保存ボタンの左側にあります。
John Zwinck

@JohnZwinck、あなたのコメントのリンクは現在死んでいます。
user4015990

56

私はsubplots_adjust(hspace = 0.001)が最終的に私のために働いているものであることがわかりました。space = Noneを使用しても、各プロットの間にまだ空白があります。ゼロに非常に近い値に設定すると、強制的に整列するように見えます。ここにアップロードしたものは、最もエレガントなコードではありませんが、hspaceのしくみを確認できます。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure()

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(5):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x,y)
    plt.subplots_adjust(hspace = .001)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()

ここに画像の説明を入力してください


31
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,60))
plt.subplots_adjust( ... )

plt.subplots_adjustの方法:

def subplots_adjust(*args, **kwargs):
    """
    call signature::

      subplots_adjust(left=None, bottom=None, right=None, top=None,
                      wspace=None, hspace=None)

    Tune the subplot layout via the
    :class:`matplotlib.figure.SubplotParams` mechanism.  The parameter
    meanings (and suggested defaults) are::

      left  = 0.125  # the left side of the subplots of the figure
      right = 0.9    # the right side of the subplots of the figure
      bottom = 0.1   # the bottom of the subplots of the figure
      top = 0.9      # the top of the subplots of the figure
      wspace = 0.2   # the amount of width reserved for blank space between subplots
      hspace = 0.2   # the amount of height reserved for white space between subplots

    The actual defaults are controlled by the rc file
    """
    fig = gcf()
    fig.subplots_adjust(*args, **kwargs)
    draw_if_interactive()

または

fig = plt.figure(figsize=(10,60))
fig.subplots_adjust( ... )

画像のサイズが重要です。

「私はhspaceをいじってみましたが、それを増やすと、オーバーラップの問題を解決せずにすべてのグラフを小さくするだけのようです。」

したがって、より多くの空白を作成し、サブプロットサイズを維持するには、画像全体を大きくする必要があります。


2
画像のサイズが重要です。画像サイズを大きくすると、この問題を解決できます。設定するplt.figure(figsize=(10, 7))と、写真のサイズは2000 x 1400pixになります
Belter


20

tight_layoutmatplotlib と同様に(バージョン2.2以降)が提供しますconstrained_layouttight_layout単一の最適化されたレイアウトのコードでいつでも呼び出すことができるとは対照的に、constrained_layoutプロパティであり、アクティブであり、すべての描画ステップの前にレイアウトを。

したがって、figure(constrained_layout=True)またはなどのサブプロットの作成前または作成中にアクティブ化する必要があります。subplots(constrained_layout=True)

例:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

ここに画像の説明を入力してください

constrained_layoutも設定できます rcParams

plt.rcParams['figure.constrained_layout.use'] = True

新着情報制約付きレイアウトガイドをご覧ください


1
これを試してみる:このオプションを見たことtight_layoutがない
javadba

これは有望に聞こえますが、十分な間隔がありません(軸のラベルとタイトルがまだ重複しています)ため、レンダリングにかなり時間がかかりました。tight_layout()うまく機能した
craq

2
@craq正解です。contrained_layoutこの回答に示されているように、すべての描画ステップの前にレイアウトを最適化するため、通常は遅くなります。
ImportanceOfBeingErnest

私にとってこれは最も有用な答えでした-私にとっては、tight_layoutは常にパネルのタイトルのためのスペースを空けるために垂直方向の間隔を改善しますが、毎回y軸のラベルを切り取ってしまいます。代わりに、これは完全に機能します。
エイドリアン・トンプキンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.