Jupyter运行Matplotlib代码图片可显示但保存为空如何修复?
问题原因
导致保存为空图片的核心原因有2个:
- 路径处理逻辑错误:
os.path.join拼接路径后调用.replace("/", "")会删除Unix系统下的路径分隔符,导致输出路径不符合预期,若test目录不存在会触发静默写入失败,最终生成空白文件。 - 冗余的轴设置与绘图接口混用:显式创建
ax对象后使用隐式plt接口操作,叠加冗余的NullLocator设置,可能触发matplotlib边界计算异常,使用bbox_inches="tight"时误将所有内容判定为超出边界被裁剪。
修复代码
如果需要完全无边距保存原图,推荐使用匹配图片尺寸的画布方案,避免边界裁剪问题:
import numpy as np import os import matplotlib.pyplot as plt import matplotlib.ticker as tkr # 读取图片 path = 'photo.jpg' im = plt.imread(path) dpi = 100 # 可根据需求调整输出分辨率 # 创建匹配图片尺寸的画布,完全消除边距 fig, ax = plt.subplots(figsize=(im.shape[1]/dpi, im.shape[0]/dpi), dpi=dpi) fig.subplots_adjust(left=0, right=1, top=1, bottom=0) ax.imshow(im) ax.axis("off") # 直接用显式ax接口操作,已隐藏刻度和边框,无需额外设置NullLocator # 先创建输出目录避免写入失败 os.makedirs("test", exist_ok=True) filename = os.path.basename(path).split(".")[0] output_path = os.path.join("test", filename+".png") # 不要删除路径分隔符 # 保存时不需要额外调整边界,画布已经匹配图片尺寸 fig.savefig(output_path, dpi=dpi) plt.show() plt.close()
轻量调整方案
如果你需要保留bbox_inches="tight"的原有配置,只需要删除错误的路径处理、冗余的轴设置、新增目录创建逻辑即可正常保存:
plt.axis("off") os.makedirs("test", exist_ok=True) filename = os.path.basename(path).split(".")[0] output_path = os.path.join("test", filename+".png") plt.savefig(output_path, bbox_inches="tight", pad_inches=0.0) plt.show() plt.close()
内容的提问来源于stack exchange,提问作者MelleRx
相关产品推荐
相关产品推荐

