HOWTO · Matplotlib
如何在 Matplotlib 中改变子图之间的间距
使用 tight_layout()、subplots_adjust()、subplot_tool() 或 constrained_layout=True,改善包含许多子图的 Matplotlib 图形中的子图间距。
本页内容
若要让包含多个子图的 Matplotlib 图表更易阅读,请根据工作流程选择合适的布局控制:调用 tight_layout() 自动为子图装饰元素留出空间,使用 plt.subplots_adjust() 设置间距和图形边距,打开 plt.subplot_tool() 进行交互式调整,或在创建子图时启用 constrained_layout=True。这些控制项会调整布局;如果每个坐标轴需要更多空间,也可以增大图形尺寸或调整行列数。
使用 tight_layout() 避免子图重叠
在添加绘图、标签和标题后调用 fig.tight_layout()。它会调整子图位置,为坐标轴标签和标题等装饰元素留出空间。当默认布局显得拥挤时,这是一个很好的首选方案;不过,并非所有布局都能因此解决问题,尤其是图形包含复杂装饰元素时。
下面的完整示例会在 2×2 网格中创建四个带标题的绘图,然后自动调整布局。请注意,未修改的示例代码显示的图表标题是英文,例如 “Sine function” 和 “Cosine function”。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 100)
series = [
(np.sin(x), "Sine function"),
(np.cos(x), "Cosine function"),
(1 / (1 + np.exp(-x)), "Sigmoid function"),
(np.exp(x), "Exponential function"),
]
fig, axes = plt.subplots(2, 2)
for ax, (values, title) in zip(axes.flat, series):
ax.plot(x, values)
ax.set_title(title)
fig.tight_layout()
plt.show()
请在已安装 NumPy 和 Matplotlib 的 Python 环境中运行示例。添加标题和绘图数据后,示例会调整布局。
使用 plt.subplots_adjust() 设置子图间距和边距
如果需要直接控制坐标轴之间的间隔或网格周围的留白,请使用 plt.subplots_adjust()。wspace 将水平间隔设为平均坐标轴宽度的比例;hspace 将垂直间隔设为平均坐标轴高度的比例。left、right、bottom 和 top 则分别将子图区域的边缘设为图形宽度或高度的比例。
下面的示例采用相同的四图布局,并增大了各行之间的间隔:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 100)
series = [
(np.sin(x), "Sine function"),
(np.cos(x), "Cosine function"),
(1 / (1 + np.exp(-x)), "Sigmoid function"),
(np.exp(x), "Exponential function"),
]
fig, axes = plt.subplots(2, 2)
for ax, (values, title) in zip(axes.flat, series):
ax.plot(x, values)
ax.set_title(title)
fig.subplots_adjust(left=0.12, right=0.95, bottom=0.12, top=0.9, wspace=0.25, hspace=0.4)
plt.show()
增大 wspace 或 hspace 可以加宽对应方向的间隔。调整四个边缘值,可以为子图网格周围预留更多空间,例如为标签留出额外位置。这些设置控制图形内部的坐标轴布局;如果整个图形都需要更大空间,请在 plt.subplots() 中调整 figsize。
使用 plt.subplot_tool() 交互式调整子图布局
plt.subplot_tool() 会打开一个 Matplotlib 窗口,其中的控件可以调整子图间距和边距。如果想通过视觉方式微调图形,再将选定的设置应用到脚本中,这个工具会很有用。它需要交互式 Matplotlib 后端和图形界面环境;它不能用于调整静态图像或无图形界面的绘图会话。
在带有图形界面的交互式会话中,创建图形后,将该图形传给 plt.subplot_tool(fig)。此调用依赖带有关联工具栏的 Matplotlib 画布管理器;用于无头渲染等非交互式后端不提供该工具栏,因此无法在此类环境中启动此工具。这个交互式示例有意不作为可在无头环境中运行的脚本呈现。
查看图形时,可以使用工具中的控件更改子图参数。布局满意后,在代码中用 plt.subplots_adjust() 设置相应的 wspace、hspace 和边距值,以便重复生成相同的输出。
创建子图时启用 constrained_layout=True
如果希望图形在绘制时自动安排空间,请在调用 plt.subplots() 时传入 constrained_layout=True。布局引擎会考虑标题和标签等子图装饰元素。请在创建图形时启用此选项;它用于在绘图过程中管理布局,但遇到复杂装饰元素时,仍可能需要手动调整。详情请参阅 Matplotlib constrained layout 指南。
import numpy as np
import matplotlib.pyplot as plt
a = np.linspace(0, 5, 100)
figure, axes = plt.subplots(2, 2, constrained_layout=True)
axes[0, 0].plot(a, np.exp(a))
axes[0, 1].plot(a, np.sin(a))
axes[1, 0].plot(a, np.cos(a))
axes[1, 1].plot(a, a ** 2)
for index, ax in enumerate(axes.flat, start=1):
ax.set_title(f"Subplot {index}")
plt.show()
这四种方法都可以帮助管理子图布局,但适用于不同的工作流程:添加内容后快速自动调整可使用 tight_layout();需要明确指定数值时可使用 plt.subplots_adjust();交互式微调可使用 plt.subplot_tool();创建图形时希望自动处理间距,则可启用 constrained_layout=True。