【问题标题】:Matplotlib (GridSpec) - Subplot axis labels being cut-off? Tried `tight_layout`Matplotlib (GridSpec) - 子图轴标签被截断?试过`tight_layout`
【发布时间】:2018-10-11 01:43:35
【问题描述】:

我正在使用 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()

这会生成下面的图像。

【问题讨论】:

  • 我认为tight_layout 会与您在这里需要的相反。相反,使图形边距更大,例如通过使用bottom=0.3 左右。
  • 感谢您的回复。你介意提供一个具体的例子吗?我已经尝试过fig.subplots_adjust(bottom=0.3)plt.subplots_adjust(bottom=0.3)ax.margins。您指的是不同类型的图形边距吗?
  • 我指的是bottom=0.3,如fig.subplots_adjust(bottom=0.3)。如果你能提供一个可运行的例子,我可以修改它。见minimal reproducible example
  • 抱歉,我已经编辑了代码,现在可以运行了。

标签: python matplotlib axis-labels subplot


【解决方案1】:

如前所述,将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()

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

【讨论】:

  • 谢谢!虽然,当我尝试运行它时,我得到了与以前相同的图表......我刚刚尝试将一些参数重置为默认值:mpl.rcParams.update(mpl.rcParamsDefault)。但是,这似乎也不能解决问题。
  • 哦,所以当从这个答案复制代码时,输​​出看起来与我显示的图像不同?我将 python 2.7 与 matplotlib 2.2.2 和 Qt4Agg 后端一起使用,但这并不重要。如果您将 rcParams figure.autolayoutfigure.constrained_layout.use 设置为 True,它可以解释差异,但似乎您已经可以排除它(尽管我会使用 matplotlib.rcdefaults() 返回默认值)。您在哪个解释器中运行它?是否有任何其他代码被注入,仍然存在?
  • 我将后端类型更改为Qt4Agg,但仍然遇到同样的问题。没有残留代码,我运行了您在新笔记本中发布的代码,其中没有任何内容。我发现现在保存这个数字没有问题(以前也有)。我不确定它是否与更改后端或重置我的默认设置有关,但它确实有效!虽然它在 Jupyter 中仍然不能正确输出。
  • 哈哈,你使用的是 Jupyter notebook 很重要。我更新了答案。
  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
相关资源
最近更新 更多