matplotlibのサブプロット間のギャップを取り除く方法は?


116

以下のコードは、サブプロット間にギャップを生成します。サブプロット間のギャップを削除して画像をタイトなグリッドにするにはどうすればよいですか?

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

import matplotlib.pyplot as plt

for i in range(16):
    i = i + 1
    ax1 = plt.subplot(4, 4, i)
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')
    plt.subplots_adjust(wspace=None, hspace=None)
plt.show()

2
リンクを投稿して編集できます。Noneあなたが思っていることをしていません。 「デフォルトを使用する」という意味です。
tacaswell 2013年

「なし」の代わりに数字を追加してみましたが、問題は解決しませんでした。
user3006135 2013年

4
plt.subplots_adjust(wspace=0, hspace=0)あなたが'equal'アスペクトを使うという事実がなければ、あなたの問題を解決するでしょう。詳細については私の回答を参照してください。
apdnu 2016年

回答:


100

gridspecを使用して、軸間の間隔を制御できます。もっとあります情報がここに。

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.figure(figsize = (4,4))
gs1 = gridspec.GridSpec(4, 4)
gs1.update(wspace=0.025, hspace=0.05) # set the spacing between axes. 

for i in range(16):
   # i = i + 1 # grid spec indexes from 0
    ax1 = plt.subplot(gs1[i])
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')

plt.show()

軸が非常に接近している


35
そのこれらに限定されないGridSpec:あなたが作成時に姿をつかむ場合は、またして距離を設定することができ、fig.subplots_adjust(hspace=, wspace=)
ルトガーKassies

3
forループの最後の行はどういう意味ですか?
CiprianTomoiagă、2018

これはとても良いヒントですが、使用しませんsubplotsこの答えは犠牲を払わずに仕事を成し遂げるsubplots
wizclown

軸の最初の行と2番目の行の間の水平方向の間隔のみを削除する方法はありますか?
ステファノ

136

問題は、の使用ですaspect='equal'。これにより、サブプロットが任意のアスペクト比に拡大され、すべての空きスペースが埋められるのを防ぎます。

通常、これは機能します:

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])

plt.subplots_adjust(wspace=0, hspace=0)

結果はこれです:

ただし、aspect='equal'次のコードのように:

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

plt.subplots_adjust(wspace=0, hspace=0)

これは私たちが得るものです:

この2番目のケースの違いは、x軸とy軸のピクセル数を同じにしたことです。軸はデフォルトで0から1になるため(つまり、何かをプロットする前)、aspect='equal'各軸を強制的に正方形にします。この図は正方形ではないので、pyplotは軸間に水平方向の間隔を追加します。

この問題を回避するには、図を正しいアスペクト比に設定します。ここでは、オブジェクト指向のpyplotインターフェイスを使用します。これは、一般的に優れていると思います。

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8)) # Notice the equal aspect ratio
ax = [fig.add_subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

fig.subplots_adjust(wspace=0, hspace=0)

結果は次のとおりです。


3
ありがとう!あなたの答えはシンプルで完璧に機能します。plt.subplots_adjust(wspace=0, hspace=0)
MohamedEzz 2016年

35

gridspecを完全に使用せずに、wspacehspaceをゼロに設定することにより、ギャップを削除するために以下を使用することもできます。

import matplotlib.pyplot as plt

plt.clf()
f, axarr = plt.subplots(4, 4, gridspec_kw = {'wspace':0, 'hspace':0})

for i, ax in enumerate(f.axes):
    ax.grid('on', linestyle='--')
    ax.set_xticklabels([])
    ax.set_yticklabels([])

plt.show()
plt.close()

その結果:

。


4

試しましたplt.tight_layout()か?

plt.tight_layout() ここに画像の説明を入力してください それなし: ここに画像の説明を入力してください

または:このようなもの(を使用add_axes

left=[0.1,0.3,0.5,0.7]
width=[0.2,0.2, 0.2, 0.2]
rectLS=[]
for x in left:
   for y in left:
       rectLS.append([x, y, 0.2, 0.2])
axLS=[]
fig=plt.figure()
axLS.append(fig.add_axes(rectLS[0]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i],sharey=axLS[-1]))    
axLS.append(fig.add_axes(rectLS[4]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[8]))
for i in [5,6,7]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))     
axLS.append(fig.add_axes(rectLS[12]))
for i in [9,10,11]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))

軸を共有する必要がない場合は、単純に axLS=map(fig.add_axes, rectLS) ここに画像の説明を入力してください


私はタイトなレイアウトを試みましたが、それは私が欲しいものであるギャップを取り除きませんでした。gridspecソリューションが機能しました。提案ありがとうございます。
user3006135 2013年

これは、他の提案と組み合わせてうまく機能しました。tight_layout()は、目的を果たさなかったプロットの上下の空白を取り除くのに役立ちました。
DChaps

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.