Python Matplotlib紧密布局集矩形元组

Python Matplotlib紧密布局集矩形元组,python,matplotlib,plot,figure,Python,Matplotlib,Plot,Figure,我已经创建了以下代码,它以一种对我有用的方式打印一个绘图并格式化轴标签和记号。我有一个紧_布局的问题,它将垂直旋转的x轴刻度标签以及x轴标签留在图形窗口之外 为了尝试解决这个问题,我所做的是手动重新缩放plot窗口,并从figure窗口手动设置rect元组。经过一些尝试,我发现在我的例子中(左、下、右、上)的最佳值是[0.163,0.391,0.905,0.977]。接下来,我认为我应该将其合并到我的代码中,以便我的绘图首先以正确的大小显示出来:为此,我使用了以下命令: 图:紧凑布局(rect=

我已经创建了以下代码,它以一种对我有用的方式打印一个绘图并格式化轴标签和记号。我有一个紧_布局的问题,它将垂直旋转的x轴刻度标签以及x轴标签留在图形窗口之外

为了尝试解决这个问题,我所做的是手动重新缩放plot窗口,并从figure窗口手动设置rect元组。经过一些尝试,我发现在我的例子中(左、下、右、上)的最佳值是[0.163,0.391,0.905,0.977]。接下来,我认为我应该将其合并到我的代码中,以便我的绘图首先以正确的大小显示出来:为此,我使用了以下命令:

图:紧凑布局(rect=[0.163,0.391,0.905,0.977])

但是,它不起作用,图形显示的rect值与我设置的值不同

问题1:如何从代码中设置rect值,而不是手动设置

问题2:是否有更好/更容易的替代方案来实现所需的功能

# dt_objects is a list of datetime objects. My x-axis is timestamps
# for y_axis, set any series. The code will set the y axis based on the min,max value of y-values

matdates=date2num(dt_objects)
x_axis=matdates

fig,ax = plt.subplots()
ax.plot_date(x_axis,y_axis,markersize=8)
ax.axhline(y=y_axis.mean(),linestyle='--',color='red',alpha=0.5)

ax.xaxis.set_major_locator(AutoDateLocator(minticks=1, maxticks=5))         #Set position of Major X ticks
ax.xaxis.set_minor_locator(AutoDateLocator(minticks=10, maxticks=30))       #Set position of Minor X ticks
ax.xaxis.set_major_formatter( DateFormatter('%Y/%m/%d-%H:%M:%S'))           #Set format of Major X ticks
ax.xaxis.set_minor_formatter( DateFormatter('%H:%M:%S'))                    #Set format of X ticks
ax.tick_params(axis='x',which='major',rotation=90,labelsize=14)                          #Set parameters of Major X ticks    
ax.tick_params(axis='x',which='minor',rotation=80,labelsize=12)                          #Set parameters of Major X ticks      
plt.setp(ax.get_xticklabels(), fontsize=14, fontweight="bold")              #Set font of Major X ticks  

ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))                    #Set format of Major Y ticks
ax.tick_params(axis='y',which='major',labelsize=14)
calculateYpadding=(y_axis.max()-y_axis.min())*0.1                           # Padding is 10% of the max difference in y values :)
ax.set_ylim(round(y_axis.min(),2)-calculateYpadding, round(y_axis.max(),2)+calculateYpadding)         #Set boundaries of Y axis
ax.yaxis.set_major_locator(MaxNLocator(nbins = 'auto',min_n_ticks = 5)) 
plt.grid()

ax.set_xlabel("Time",style='italic',fontsize=14)
ax.xaxis.set_label_coords(1.08, -0.1)

ax.set_ylabel(str(MeasurementType),labelpad=10,style='italic', fontsize=14)
#ax.yaxis.set_label_coords(-0.1, 0.5)
#plt.xlabel("Time",horizontalalignment='right', position=(1,60))\
    
#ax.set_title(str(MeasurementType),fontweight="bold", pad=20,fontsize=20)
rstButton.config(state=tk.NORMAL)
fig.tight_layout(rect=[0.163, 0.391, 0.905, 0.977])
plt.show()
编辑:因为有人告诉我我的问题不清楚,所以我添加了两个屏幕截图来更好地解释这个问题。下面是上述代码的结果。另外,在左下角,您可以在窗口中看到,top、bottom、left、right的值与我的代码中在rect tuple中设置的值不同

我想要的输出是:

它是通过手动调整图形的参数来实现的,直到达到令人满意的点为止。正是从这里,我提取了这些值并将它们放在rect元组中,但它不起作用。希望现在我能更清楚地知道我想要实现什么,问题是什么

编辑2:以下是建议解决方案的结果

如您所见,两个轴的标签未正确放置

试试:


fig,ax=plt.subplot(constrated_layout=True)

我尝试了你的建议,收到了以下警告:“用户警告:未应用紧密布局。左右边距不能大到足以容纳所有轴装饰。fig.Tight_layout(rect=[0.907,0.392,0.907,0.977]),不用说,所需的功能仍未实现。有什么想法吗?你不能同时使用约束布局和紧密布局。如果你把紧密布局的调用放在那里,你从来没有尝试过约束布局。我从来没有告诉过你一起使用它们。顺便说一句,好吧,我试过了,没有紧凑的布局,但是x标签和y标签并没有全部包含在figure窗口中。请参见编辑2了解您的解决方案结果。它实际上根本不清楚您要做什么,并且这不是一段可复制的代码。但是,似乎不太可能希望rect为
[0.907,0.392,0.907,0.977]
。请阅读以了解kwarg矩形的含义。也请考虑阅读和@ JoykLyMak,请参阅我的编辑更好的解释,希望它会更有帮助。至于rect元组,正如您所说,最初的元组是错误的,我将它们更改为我认为“应该”有效但不有效的元组。是的,这是真的,没有任何东西会自动满足您的需要,您需要手动设置。水平空间用于ylabel,而不是垂直空间,因为这会导致不可能的情况。您应该将图形放大和/或使用更小的标签。我也不会坚持那样把“时间”放在极右翼。如果你的观众不知道这些标签是时间,他们可能不会理解太多其他的东西。最后,你的时间标签在空间上是相当浪费的。你可以考虑
fig,ax = plt.subplots(constrained_layout=True)