问题:如何消除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()
回答 0
您可以使用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()
回答 1
问题是使用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'
强制每个轴为正方形。由于该图不是正方形,因此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)
结果如下:
回答 2
在不完全采用gridspec的情况下,还可以通过将wspace和hspace设置为零来使用以下方法消除差距:
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()
导致:
回答 3
你试过了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)
回答 4
对于最新的matplotlib版本,您可能需要尝试Constrained Layout。plt.subplot()
但是,这不起作用,因此您需要使用plt.subplots()
:
fig, axs = plt.subplots(4, 4, constrained_layout=True)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。