根本原因是plt.subplots()默认布局参数未预留足够空间,尤其y轴标签长或多子图时易致yticklabels与相邻xticklabels重叠;通常用plt.tight_layout()可解决,若失效则需增大figsize、调整pad或手动用subplots_adjust微调wspace/hspace。

子图间距太小导致坐标轴标签重叠
根本原因是 plt.subplots() 默认的布局参数没预留足够空间,尤其当 y 轴标签较长或子图数量多时,yticklabels 和相邻子图的 xticklabels 容易挤在一起。不是“画错了”,是布局没调好。
直接用 plt.tight_layout() 通常能解决大部分情况;但如果刻度标签特别长、有旋转、或用了 constrained_layout=True 但效果不佳,就得手动干预:
-
plt.subplots(nrows=2, ncols=2, figsize=(8, 6))后立刻加plt.tight_layout(pad=1.2),pad控制子图边缘到 figure 边界的最小距离(单位:英寸) - 若
tight_layout报Warning: tight_layout not applied,说明 figure 尺寸不够,优先增大figsize,再调pad - 避免在
tight_layout()之后再调用plt.xlabel()或plt.suptitle()—— 这些会破坏已计算的布局,应在其前设置
共享坐标轴时 tick 标签仍重叠
用 sharex=True 或 sharey=True 创建子图后,虽然轴对象复用,但默认只隐藏中间子图的 tick labels,顶部/底部或左侧/右侧的标签仍可能和相邻图的标题/刻度冲突。
关键不是禁用标签,而是控制显示逻辑:
立即学习“Python免费学习笔记(深入)”;
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- 对共享 x 轴:用
ax.tick_params(labelbottom=False)关闭非底部子图的 x 标签,再单独给最下方子图开ax.tick_params(labelbottom=True) - 对共享 y 轴:类似地,用
labelleft=False关闭中间和右侧子图的 y 标签,仅保留最左侧子图的labelleft=True - 别依赖
plt.setp(ax.get_xticklabels(), visible=False)—— 这会清空标签但不释放空间,重叠可能依旧存在
使用 subplots_adjust() 手动微调却越调越乱
subplots_adjust() 的 left/right/top/bottom 是归一化值(0–1),容易误估。常见错误是设 left=0.1 后发现左边空白太大,其实是因 figure 宽度没变,而 label 文字宽度被压缩了。
更稳妥的做法是:
- 先用
fig = plt.figure(figsize=(10, 6))明确尺寸,再用fig.subplots_adjust(left=0.12, bottom=0.1, right=0.95, top=0.9, wspace=0.3, hspace=0.4) -
wspace控制列间水平间距(默认 0.2),hspace控制行间垂直间距(默认 0.2)—— 这两个比left/right更直接影响重叠 - 如果改了
hspace仍重叠,大概率是字体大小或 label 长度超出预期,此时应配合ax.tick_params(axis='both', labelsize=8)缩小字体
中文标签重叠且字体渲染异常
Matplotlib 默认字体不支持中文,强行显示会导致方块、错位甚至标签位置偏移,看起来像“重叠”,实则是字体 fallback 失败后的排版崩溃。
必须显式设置中文字体,并确保其支持粗体、斜体等变体:
- 运行前加:
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'](Windows 常用) - 关闭无衬线字体粗体模拟:
plt.rcParams['axes.unicode_minus'] = False,否则负号会变成方块 - 避免用
plt.title('中文', font='SimHei')单独设字体 —— 子图间字体不一致会导致 baseline 错位,加剧视觉重叠
真正麻烦的从来不是 layout 参数本身,而是字体加载失败后 matplotlib 用占位符撑开空间,又不告诉你哪里出问题。检查是否重叠前,先确认所有中文都正常显示。

















