如何删除matplotlib中的子图之间的差距?

下面的代码产生子图之间的差距。 如何消除子图之间的差距,使图像变得紧密?

在这里输入图像描述

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() 

您可以使用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.subp plt.show() 

轴非常靠近在一起

问题是使用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) 

这就是我们得到的:

第二种情况的不同之处在于,您已经强制x轴和y轴具有相同数量的单位/像素。 由于轴默认情况下从0变为1(即,在绘制任何东西之前),使用aspect='equal'强制每个轴为平方。 由于graphics不是正方形,因此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) 

结果如下:

如果不完全使用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() 

导致:

。

你尝试过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) 在这里输入图像描述