调整包含子图的图像周围的间距

10

我正在使用Matplotlib,尝试调整绘制包含子图网格的图形周围的空白区域。

要求:能够选择所有子图的纵横比(它们都是相同的),定义子图与保存的图形边缘之间有多少空白区域,包括顶部、底部和左侧。 我不需要右侧有任何额外的空间。

到目前为止,我已经编写了以下代码:

import matplotlib.pyplot as plt
fig, axes = plt.subplots(ncols=6, nrows=2, sharex=True, 
                         sharey=True, figsize=(16,8))

axes[0,0].plot(x,y)
etc...

plt.subplots_adjust(hspace=1.0, wspace=0.02, bottom=0.17, left=0.075, top=0.18)

plt.savefig('Fig1_matplot.pdf', bbox_inches='tight')

当前情况下,如果我不指定figsize=(),子图的纵横比就会出错。如果我这样做,那么每当我在subplots_adjust()中更改参数时,它的纵横比就会发生变化。显然,left 不能 >= rightbottom 也不能 >= top。如果我定义的top不是0,则它会将所有的子图完全压缩成位于图的底部的一条线。

如果我指定bbox_inches='tight',则它会切掉我定义的底部和左侧的空白,但如果我没有指定它,那么右侧就会留下多余的空白,因为我无法摆脱它(right 小于等于 left)。

我有些困惑,请提供任何帮助将不胜感激。

谢谢。

1个回答

24

使用 subplots_adjust 时,需要将 leftrightbottomtop 的值作为图形宽度和高度的比例提供。此外,所有值都是从图形的左边缘和底部边缘测量的。这就是为什么 righttop 不可以低于 leftbottom 的原因。一个典型的设置如下:

plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)

另一方面,如果你想以英寸为绝对值提供空白,则必须通过图像的宽度和高度进行除法计算。例如,在您的情况下,可以通过以下方式实现四周留出1英寸的边距:

plt.subplots_adjust(left=1/16.0, right=1-1/16.0, bottom=1/8.0, top=1-1/8.0)

为了更具灵活性,我通常将图形的宽度和高度参数化:

figw, figh = 16.0, 8.0
fig, axes = plt.subplots(ncols=6, nrows=2, sharex=True, sharey=True,
                         figsize=(figw, figh))
plt.subplots_adjust(left=1/figw, right=1-1/figw, bottom=1/figh, top=1-1/figh)

hspacewspace被视为一个面板的轴宽和高的一部分,因此它们的绝对值取决于图形尺寸、外边距和子图数量。这将需要进行更精细调整的数学计算。


好的回答。我发现很难得到一个通用的解决方案。我将图例放在轴的顶部,这经常需要调整。因此,我编写了一个方便的函数,它接受参数 adjustlegend_loc,并传递 adjust={'left': 0.125, 'bottom': 0.1, 'right': 0.9, 'top': 0.9}(典型的默认值),例如 legend_loc=(1.0, 1.3)。在方便函数内部,我有 plt.subplots_adjust(left=adjust['left'], right=adjust['right'], bottom=adjust['bottom'], top=adjust['top']),紧接着是 plt.savefigax.legend(bbox_to_anchor=legend_loc),对于单个轴 ax - PatrickT

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