如果我想在matplotlib中对图形边距的大小进行精细控制,我通常会这样设置我的代码。此外,我还展示了如何设置ylabel的位置,这样您可以轻松地将两个图的ylabels对齐。
import matplotlib.pyplot as plt
plt.close('all')
fwidth = 8.
fheight = 4.
fig = plt.figure(figsize=(fwidth, fheight))
left_margin = 0.95 / fwidth
right_margin = 0.2 / fwidth
bottom_margin = 0.5 / fheight
top_margin = 0.25 / fheight
x = left_margin
y = bottom_margin
w = 1 - (left_margin + right_margin)
h = 1 - (bottom_margin + top_margin)
ax = fig.add_axes([x, y, w, h])
xloc = 0.25 / fwidth
yloc = y + h / 2.
ax.set_ylabel('yLabel', fontsize=16, verticalalignment='top',
horizontalalignment='center')
ax.yaxis.set_label_coords(xloc, yloc, transform = fig.transFigure)
plt.show(block=False)
fig.savefig('figure_margins.png')
这将产生一个8in x 4in的图形,左、右、下和上边缘的边距分别为0.95、0.2、0.5和0.25英寸。采用这种方法的好处之一是边距的大小以绝对单位(英寸)定义,这意味着即使改变图形的大小,它们也会保持一致。
至于ylabel,水平方向上,标签的顶部距离图形左侧边缘0.25英寸,而垂直方向上,标签的中心对应于轴的中心。请注意,由于ylabel旋转了90度,因此实际上垂直对齐和水平对齐的含义被倒置了。
下面显示了使用上述代码输出的结果,其中y轴限制分别设置为[0,1]和[0,18]。
tight_layout()
应该调整的内容。在Figure
中,艺术家们被放置/调整为 [0, 1] 的单位空间。在渲染时,该空间被转换为屏幕/像素空间。你所看到的是tight_layout
的一种特性,而不是 bug。如果您不想要这个特性,请不要使用tight_layout
。 - tacaswell