Matplotlib保存图像仅截断Y轴刻度/数值的问题排查
问题解决方案
核心问题
你的代码混用了Matplotlib的pyplot全局接口(plt.xxx)和面向对象子图接口(ax.xxx),这会导致坐标轴设置混乱——plt的函数只会作用于当前激活的子图,而非你目标的子图,进而出现Y轴刻度截断、X轴刻度未显示到900的问题。
修正后的代码示例
import matplotlib.pyplot as plt import numpy as np import os fig = plt.figure(figsize=(30,15)) ax1 = fig.add_subplot(121) # 修正笔误:用ax1.plot而非ax1.plt ax1.plot(....) # 子图专属设置改用ax1.set_xxx接口 ax1.set_xlabel(...) ax1.set_ylabel(...) ax1.set_xlim(...) ax1.set_ylim(...) # 确保X轴刻度包含900:np.arange是左闭右开区间,终点需设为901 ax1.set_xticks(np.arange(0, 901, 100)) ax1.set_yticks(np.arange(...)) ax1.tick_params(axis='both', which='major', labelsize=12) ax1.grid(visible=True, which='major', axis='both') ax2 = fig.add_subplot(122) ax2.plot(....) ax2.set_xlabel(...) ax2.set_xlim(...) ax2.set_ylim(...) ax2.set_xticks(np.arange(0, 901, 100)) ax2.set_yticks(np.arange(...)) ax2.tick_params(axis='both', which='major', labelsize=12) ax2.grid(visible=True, which='major', axis='both') # 全局标题和底部文字放在所有子图设置完成后配置 plt.suptitle(...) plt.figtext(0.415, 0.04, "...") plt.figtext(0.19, 0.04, "...") plt.figtext(0.84, 0.04, "...") plt.figtext(0.6125, 0.04, "...") # 调整布局,给全局标题预留顶部空间,避免坐标轴被截断 plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # 最后执行保存操作 plt.savefig(os.path.join(parentDirectory, "123.png"), bbox_inches='tight', dpi=150)
关键修改说明
- 统一使用面向对象接口:所有针对单个子图的设置(坐标轴标签、刻度、范围等)都用
ax.set_xxx或ax.xxx,避免plt.xxx的全局干扰,确保每个子图的设置精准生效。 - 修正
np.arange区间:np.arange(start, stop, step)是左闭右开区间,要显示到900,需将stop设为901,否则900不会被包含在刻度中。 - 正确调用布局调整:
tight_layout()需在所有子图和全局元素(标题、figtext)设置完成后调用,rect参数调整上下边距,避免标题或底部文字遮挡坐标轴刻度。 - 修正函数调用笔误:代码中
ax1.plt(....)是错误写法,应为ax1.plot(....)。
补充说明
plt.show()看起来正常是因为Matplotlib会为交互式窗口自动调整布局,但保存图片时必须手动完成布局优化,不能依赖自动调整。
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

