2017-02-26 6 views
1

複数の画像をサブプロットにプロットし、サブプロット間の領域を削除(水平および垂直)するか、または制御します。私はHow to Use GridSpec...で提案を使用しようとしました。私もここで試してみましたが、サブプロット()を使用していません:space between subplots 私は以下のコードで私が何をしているのかというと、水平スペースをなくすことができます。私は他の投稿を試してみて、私が欲しいものをやっていないので、重複としてマークしないでください。私のコードは以下の通りです。多分、gridspec_kw辞書に必要な別のキーワード引数がありますか? 私はこのためにplt.subplots()を使わないplt.subplots()を使いたいと思います。重要な場合、画像は正方形ではなく、長方形です。 plt.show()の前にf.tight_layout(h_pad=0,w_pad=0)を追加しようとしましたが、何も変更されませんでした。gridplecとplt.subplots()を組み合わせてサブプロットの行間のスペースを取り除く方法

def plot_image_array_with_angles(img_array,correct_angles,predict_angles, 
           fontsize=10,figsize=(8,8)): 
''' 
Imports: 
    import matplotlib.gridspec as gridspec 
    import numpy as np 
    import matplotlib.pyplot as plt 
''' 
num_images = len(img_array) 
grid = int(np.sqrt(num_images)) # will only show all images if square 
#f, axarr = plt.subplots(grid,grid,figsize=figsize) 
f, axarr = plt.subplots(grid,grid,figsize=figsize, 
         gridspec_kw={'wspace':0,'hspace':0}) 
im = 0 
for row in range(grid): 
    for col in range(grid): 
     axarr[row,col].imshow(img_array[im]) 
     title = 'cor = ' + str(correct_angles[im]) + ' pred = ' + str(predict_angles[im]) 
     axarr[row,col].set_title(title,fontsize=fontsize) 
     axarr[row,col].axis('off') # turns off all ticks 
     #axarr[row,col].set_aspect('equal') 
     im += 1 
plt.show() 
return 
+0

あなたはplt.subplots_adjustを試みたことがありますか? – user2660966

+0

はい、それを試みましたが、hspaceとwspaceを設定するだけではありません。以下の投稿は @ImportanceOfBeingErnestから完全に動作します。私はまだupvoteできませんが、その投稿は完全に私の質問に答える。 –

答えて

3

imshowプロットのアスペクト比は、画像のピクセルが自乗するように自動的に設定されます。この設定は、間隔の設定としてsubplots_adjustまたはgridspecのいずれの設定よりも強力です。つまり、サブプロットのアスペクトが"equal"に設定されている場合、サブプロット間の間隔を直接制御することはできません。

最初の明白な解決策は、画像のアスペクトを自動ax.set_aspect("auto")に設定することです。これは、サブプロットの間隔の問題を解決しますが、画像を歪ませます。

もう1つのオプションは、サブプロット間の間隔が必要に応じてなるように、Figureの余白とFigureのサイズを調整することです。

たとえば、fighfigwはフィギュアの高さと幅(インチ)で、sはサブプロットの幅(インチ)です。マージンは、bottom,top,leftおよびright(図形サイズに対する)および水平方向の間隔(サブプロットサイズに対して)hspaceおよびwspaceです。行の数はnと表示され、列の数はmです。 aspectは、サブプロット(画像)の高さと幅の比です(aspect = image height/image width)。

は、その後の寸法は

fig, axes = plt.subplots(nrows=n, ncols=m, figsize=(figwidth, figheight)) 
plt.subplots_adjust(top=top, bottom=bottom, left=left, right=right, 
         wspace=wspace, hspace=hspace) 

を介して設定することができ、それぞれの値は、に従って計算することができる。

enter image description here

あるいは、マージンが同じである場合:

enter image description here

例:

import matplotlib.pyplot as plt 

image = plt.imread("https://i.stack.imgur.com/9qe6z.png") 
aspect = image.shape[0]/float(image.shape[1]) 
print aspect 
n = 2 # number of rows 
m = 4 # numberof columns 
bottom = 0.1; left=0.05 
top=1.-bottom; right = 1.-left 
fisasp = (1-bottom-(1-top))/float(1-left-(1-right)) 
#widthspace, relative to subplot size 
wspace=0.15 # set to zero for no spacing 
hspace=wspace/float(aspect) 
#fix the figure height 
figheight= 3 # inch 
figwidth = (m + (m-1)*wspace)/float((n+(n-1)*hspace)*aspect)*figheight*fisasp 

fig, axes = plt.subplots(nrows=n, ncols=m, figsize=(figwidth, figheight)) 
plt.subplots_adjust(top=top, bottom=bottom, left=left, right=right, 
        wspace=wspace, hspace=hspace) 

for ax in axes.flatten(): 
    ax.imshow(image) 
    ax.set_title("title",fontsize=10) 
    ax.axis('off') 

plt.show() 

enter image description here

関連する問題