设置子图的绝对大小

nic*_*las 4 python matplotlib subplot

我知道如何使用 gridspec 或 subplots_adjust 设置图形内子图的相对大小,并且我知道如何使用 Figsize 设置图形的大小。我的问题是设置子图的绝对大小。

用例:我正在制作两个单独的图,它们将保存为学术论文的 pdf 格式。一种有两个子图,一种有三个子图(两种情况都在 1 行中)。我需要 5 个子图中的每一个都具有完全相同的大小,并且在生成的 PDF 中具有完全相同的字体大小(轴标签、刻度标签等)。在下面的示例中,字体大小相同,但子图却不同。如果我使生成的 PDF 的高度相同(因此轴也相同),则 3-subplots.pdf 上的字体将小于 2-subplots.pdf 的字体。

微量元素

import matplotlib.pyplot as plt

subplots = [2, 3]
for i, cols in enumerate(subplots):

    fig, ax = plt.subplots(1, cols, sharey=True, subplot_kw=dict(box_aspect=1))

    for j in range(cols):
        ax[j].set_title(f'plot {j*cols}')
        ax[j].set_xlabel('My x label')
    ax[0].set_ylabel('My y label')

    plt.tight_layout()
    plt.savefig(f'{cols}-subplots.pdf', bbox_inches='tight', pad_inches=0)
    plt.show()
Run Code Online (Sandbox Code Playgroud)

输出输出

小智 6

我更喜欢使用fig.add_axes([left, bottom, width, height])它来精确控制每个子图的大小和位置。leftbottom决定子图的位置,同时width决定height大小。所有数量都是图形宽度和高度的分数,因此它们都在 0 和 1 之间浮动。

一个例子:

fig = plt.figure(figsize=(8.3, 11.7))
axs = {
    "ax1": fig.add_axes([0.2, 0.7, 0.6, 0.2], xticklabels=[]),
    "ax2": fig.add_axes([0.2, 0.49, 0.6, 0.2], xticklabels=[]),
    "ax3": fig.add_axes([0.2, 0.28, 0.6, 0.2]),
}
Run Code Online (Sandbox Code Playgroud)

这样我在 A4 尺寸的图中创建了 3 个子图,每个子图的宽度为 0.6x8.3,高度为 0.2x11.7。它们之间的间距为0.1x11.7。"ax1"并且"ax2"不显示 xticklabels,以便我稍后可以为它们设置共享 x 刻度。

您可以查看 matplotlib API 参考以获取更多信息https://matplotlib.org/stable/api/figure_api.html