Python 在gridspec中调整填充/数字边距

Python 在gridspec中调整填充/数字边距,python,matplotlib,Python,Matplotlib,我的子图在图中的位置有点奇怪。顶部、底部和左侧都有大量的空间,我不需要这些空间,但是右边距有点太靠近右轴标签。参见示例 下面是我生成它的代码。请注意,我使用了紧凑的布局以及子地块调整,两者都不起作用 fig = plt.figure(figsize=(7.5,10.)) fig.patch.set_facecolor('silver') gs = gridspec.GridSpec(3,2,hspace=0.4,wspace=0.1) ax1 = plt.subplot(gs[:,0]) a1

我的子图在图中的位置有点奇怪。顶部、底部和左侧都有大量的空间,我不需要这些空间,但是右边距有点太靠近右轴标签。参见示例

下面是我生成它的代码。请注意,我使用了紧凑的布局以及子地块调整,两者都不起作用

fig = plt.figure(figsize=(7.5,10.))
fig.patch.set_facecolor('silver')
gs = gridspec.GridSpec(3,2,hspace=0.4,wspace=0.1)

ax1 = plt.subplot(gs[:,0])
a1 =  plt.plot(x, y, linestyle='-',color='b')
a1 = plt.ylabel('Y')
a1 = plt.ylim(zmax[c],zmin[c])
a1 = plt.xlabel('X')
a1 = plt.xticks([np.around(min(x),2),np.around(min(x)/2,2),0,np.around(max(x)/2,2),np.around(max(x),2)])
a1 = plt.title('(a)',fontsize=12)  

ax2 = plt.subplot(gs[0,1])
a2 = plt.plot(x2,y2, linestyle='',marker='o',color='b' )
a2 = plt.ylabel('value')
ax2.yaxis.tick_right()
ax2.yaxis.set_ticks_position('both')
ax2.yaxis.set_label_position("right")
a2 = plt.xlabel('number')
a2 = plt.title('(b)',fontsize=12) 

ax3 = plt.subplot(gs[1,1])
a3 = plt.plot(x3,y3, linestyle='--',color='b')
a3 = plt.ylabel('another y')
ax3.yaxis.tick_right()
ax3.yaxis.set_ticks_position('both') 
ax3.yaxis.set_label_position("right")
a3 = plt.xlabel('x')
a3 = plt.title('(c)',fontsize=12) 

ax4 = plt.subplot(gs[2,1])
a4 = plt.plot(x4,y4, linestyle='--',color='b')
a4 = plt.ylabel('y')
ax4.yaxis.tick_right()
ax4.yaxis.set_ticks_position('both')
ax4.yaxis.set_label_position("right")
a4 = plt.xlabel('x')
a4 = plt.title('(c)',fontsize=12) 

plt.suptitle('Title', fontsize=12,y=0.95)
plt.subplots_adjust(left=0, bottom=0, right=1, top=0, wspace=0, hspace=0)
#fig = plt.tight_layout()
plt.show()

问题是:如何增加右边距,同时缩小其他边距并保留子批次之间的填充?

可以使用轴的get\u position和set\u position方法来处理此问题

import matplotlib.pyplot as plt
ax = plt.subplot(111)
pos1 = ax.get_position() # get the original position 
pos2 = [pos1.x0 + 0.3, pos1.y0 + 0.3,  pos1.width / 2.0, pos1.height / 2.0] 
ax.set_position(pos2) # set a new position
编辑

要设置整个fig的位置,您必须设置sublotpars()


@G.S的解决方案不起作用,但激发了我仔细研究之前考虑的解决方案的灵感

plt.subplot\u调整(左=0.12,下=0.08,右=0.85,上=0.92,wspace=0.01,hspace=0.08)

实际上是有效的。关注输入的值非常重要,尽管一开始不是很直观。如果left的值=right的值,top=bottom,它将抛出一个错误。它不是从边缘到中心的距离,而是一个坐标。因此,一个不变的数字左=0,右=1,下=0,上=1。因此,移动边距基本上就是将间隔上的值从0移动到1,并且需要进行一些调整,直到看起来恰到好处。

我认为您可以在GridSpec环境中执行此操作:

gs = gridspec.GridSpec(3,2,hspace=0.4,wspace=0.1)
gs.update(left=0.1,right=0.9,top=0.965,bottom=0.03,wspace=0.3,hspace=0.09)

您可以使用它控制面板如何接近左/右/上/下页边距。对我来说效果很好。

我宁愿修改图形的整体位置,而不是单个子图,但是谢谢,我想如果我对每个子图都这样做,我可以更好地将其居中。但是它仍然不能去除不必要的宽大的边距。@durbachit我认为这将有助于你这看起来是朝着正确方向迈出的一步,但仍然不起作用。复制粘贴自您的示例,它显示“无效语法”,当我尝试按照以下文档操作时,
fig.SubplotParams(top=0,bottom=0,right=0,left=0,hspace=0,wspace=0)
,我得到了
AttributeError:“Figure”对象没有属性“SubplotParams”
,但您给我带来了另一个实际可行的想法,谢谢。我将在这里发布它。您需要首先实例化一个具有所需参数的SubPlotParams类,然后像
plt.figure那样使用它(subplotpars=SubPlotParams(top=…,bottom=…)
。看到这个解决方案对我的用例有效,但是
plt.tight\u layout()也有效。
其他人可能会尝试firsttight\u layout()在这种情况下不起作用,不幸的是,这就是为什么在我的代码中注释掉这一行。
gs = gridspec.GridSpec(3,2,hspace=0.4,wspace=0.1)
gs.update(left=0.1,right=0.9,top=0.965,bottom=0.03,wspace=0.3,hspace=0.09)