Matplotlib(GridSpec)-子图轴标签被切断?尝试使用'tight_layout'。

3
我正在使用GridSpec来组织子图。我有一个共享的colorbar用于所有图表。
所有在线建议似乎都指出tight_layout()是解决轴标签被截断问题的方法,但这似乎在这里不起作用(除非它以我不知道的另一种形式出现)。
我还尝试使用tight_layoutrect参数,用于figpltgs
import matplotlib
import matplotlib.pyplot as plt
import numpy as np 
from pylab import *
import matplotlib.gridspec as gridspec
import matplotlib.colors
from mpl_toolkits.mplot3d import Axes3D

gs = gridspec.GridSpec(1,7,hspace=0.05,wspace=0.5, width_ratios=[1,1,1,1,1,1,0.1])
figure(num=None, figsize=(18, 2), dpi=80, facecolor='w', edgecolor='k')

data = np.random.rand(3,6,224,5)

for i in range(6):
    ax = plt.subplot(gs[0, i], projection='3d')
    p = ax.scatter(data[0,i,:,0], data[0,i,:,1], data[0,i,:,2], c=data[0,i,:,4], marker='o')
    title("Case " + str(i+1))
    ax.set_xlabel('Batch Size', linespacing=3)
    ax.set_ylabel('Window Size', linespacing=3)
    ax.set_zlabel('Neurons', linespacing=3)
    ax.xaxis.labelpad=20
    ax.yaxis.labelpad=20
    ax.zaxis.labelpad=10

cbar = plt.subplot(gs[0,6])
colorbar(p, cax=cbar, label='RMSE')

plt.show()

这会生成下面的图像: enter image description here

我认为 tight_layout 在这里会产生相反的效果。相反,应该使图形边距更大,例如使用 bottom=0.3 或类似方法。 - ImportanceOfBeingErnest
谢谢您的回复。您能否提供一个具体的例子吗?我已经尝试过 fig.subplots_adjust(bottom=0.3)plt.subplots_adjust(bottom=0.3)ax.margins。您是指不同类型的图形边缘吗? - Oliver Crow
我指的是bottom=0.3,就像fig.subplots_adjust(bottom=0.3)一样。如果您能提供一个可运行的示例,我可以进行修改。请参见[mcve]。 - ImportanceOfBeingErnest
抱歉,我已经编辑了代码,现在可以运行了。 - Oliver Crow
1个回答

3
如评论所述,将bottom参数设置为较大的值,例如bottom=0.3,将为您提供更多空间以容纳坐标轴修饰符。
此外,将图形稍微变高一点(例如3英寸而不是2英寸)可能会有用,以便不会使绘图缩小太多。
import matplotlib.pyplot as plt
import numpy as np 
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D

gs = gridspec.GridSpec(1,7,hspace=0.05,wspace=0.5, bottom=0.3,
                       left=0.02, right=0.95, width_ratios=[1,1,1,1,1,1,0.1])
fig = plt.figure(figsize=(18, 3), dpi=80, facecolor='w', edgecolor='k')

data = np.random.rand(3,6,224,5)

for i in range(6):
    ax = plt.subplot(gs[0, i], projection='3d')
    p = ax.scatter(data[0,i,:,0], data[0,i,:,1], data[0,i,:,2], 
                   c=data[0,i,:,4], marker='o')
    ax.set_title("Case " + str(i+1))
    ax.set_xlabel('Batch Size', linespacing=3)
    ax.set_ylabel('Window Size', linespacing=3)
    ax.set_zlabel('Neurons', linespacing=3)
    ax.xaxis.labelpad=20
    ax.yaxis.labelpad=20
    ax.zaxis.labelpad=10

cbar = plt.subplot(gs[0,6])
fig.colorbar(p, cax=cbar, label='RMSE')

# This is only needed for jupyter
fig.add_axes([0,0,1,1]).axis("off")

plt.show()

enter image description here

不幸的是,在jupyter中,%matplotlib inline后端总是使用bbox_inches = "tight"设置创建其图像。因此,解决方法是在图形中创建一些元素,以确保“紧密”区域足够大。 在这里,一个选项是使用fig.add_axes([0,0,1,1]).axis("off")


谢谢!虽然我尝试运行它,但我得到了与之前相同的图表...我刚刚尝试将一些参数重置为默认值:mpl.rcParams.update(mpl.rcParamsDefault)。但是,这似乎也无法解决问题。 - Oliver Crow
1
哦,所以从这个答案复制代码时,输出看起来与我展示的图像不同?我使用的是Python 2.7和Matplotlib 2.2.2以及Qt4Agg后端,但那并不重要。如果您将rcParams figure.autolayoutfigure.constrained_layout.use设置为True,则可以解释差异,但似乎您已经排除了这一点(尽管我会使用matplotlib.rcdefaults()返回默认值)。您在哪个解释器中运行此代码?还可能存在其他被注入的代码吗? - ImportanceOfBeingErnest
我将后端类型更改为Qt4Agg,但仍然遇到了相同的问题。没有残留代码,我在一个空白笔记本中运行了您发布的代码。我发现现在保存图形不再有问题(之前有问题)。我不确定它是否与更改后端或重置默认值有关,但它可以工作!尽管在Jupyter中仍无法正确输出。 - Oliver Crow
1
哈哈,你使用Jupyter笔记本非常相关。我更新了答案。 - ImportanceOfBeingErnest
感谢您的帮助。 - Oliver Crow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接