Matplotlib savefig保存多图时部分图片空白问题求助
解决Matplotlib保存部分绘图空白的问题
我之前也碰到过类似的情况,大概率是这几个原因导致的,给你几个排查和解决的方向:
1. 没有关闭已保存的Figure对象
Matplotlib的Figure如果一直驻留在内存中,后续的绘图可能会出现资源冲突或者内容覆盖的问题。你可以在每次保存后关闭对应的Figure,释放资源:
import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt # 记得导入plt模块 for i in range(len(plots)): p1 = plots[i] p1.savefig("/sample/plots{}.png".format(i), bbox_inches='tight', pad_inches=0, dpi=100) plt.close(p1) # 保存后关闭当前Figure
2. 检查plots列表中的Figure是否真的包含内容
有可能某个plots[i]虽然是Figure对象,但实际上没有添加任何轴(Axes)或者绘图元素(比如折线、柱状图等)。你可以在保存前先做个简单检查:
for i in range(len(plots)): p1 = plots[i] # 检查Figure是否包含Axes对象 if len(p1.axes) == 0: print(f"提示:第{i}个绘图没有轴对象!") # 进一步检查Axes是否有实际绘图数据 for ax in p1.axes: if len(ax.lines) == 0 and len(ax.patches) == 0: print(f"提示:第{i}个绘图的轴中没有数据!") p1.savefig("/sample/plots{}.png".format(i), bbox_inches='tight', pad_inches=0, dpi=100)
3. 避免重复使用同一个Figure对象
如果你的plots列表里存在重复的Figure引用(比如同一个对象被多次添加进列表),第一次保存后,后续保存可能会因为Figure已被修改或清空而出现空白。你可以先给列表去重:
# 检查并去重plots中的Figure对象 unique_plots = [] seen_obj_ids = set() for p in plots: obj_id = id(p) if obj_id not in seen_obj_ids: seen_obj_ids.add(obj_id) unique_plots.append(p) else: print(f"发现重复的Figure对象:{p}") # 使用去重后的列表保存绘图 for i in range(len(unique_plots)): p1 = unique_plots[i] p1.savefig("/sample/plots{}.png".format(i), bbox_inches='tight', pad_inches=0, dpi=100) plt.close(p1)
4. 强制渲染绘图内容
有时候绘图元素没有被正确渲染,你可以在保存前调用canvas.draw()强制完成渲染:
for i in range(len(plots)): p1 = plots[i] p1.canvas.draw() # 强制渲染绘图内容 p1.savefig("/sample/plots{}.png".format(i), bbox_inches='tight', pad_inches=0, dpi=100) plt.close(p1)
内容的提问来源于stack exchange,提问作者Ravi Kiran G
相关产品推荐
相关产品推荐

