Python脚本中多图分存不同PDF文件异常问题咨询
问题根源分析
你的问题本质是没有正确管理Matplotlib的Figure对象。Matplotlib采用状态机模式,默认会在当前活跃的Figure上绘图:
- 如果不主动创建新的Figure,第二次绘图可能复用了第一张图的Figure(尤其是在
plt.show()未销毁旧Figure的环境中),导致两次保存都指向同一张图; - 而调用
plt.clf()后出现空白,是因为plt.show()关闭窗口后,原Figure已被销毁,plt.clf()没有可操作的对象,后续绘图的状态异常,最终保存了未正确渲染的空画布。
解决方案
下面提供两种可靠的解决方式,按推荐程度排序:
1. 显式创建独立的Figure对象(最推荐)
通过直接创建plt.figure()实例,为每张图分配完全独立的画布,彻底避免状态机的干扰:
import matplotlib.pyplot as plt # 绘制并保存第一张图 fig1 = plt.figure() plt.plot([1, 2, 3], label='Graph 1') plt.legend() fig1.savefig('graph1.pdf') plt.show() # 关闭窗口后fig1会被销毁,但我们已经完成保存 # 绘制并保存第二张图 fig2 = plt.figure() plt.plot([3, 2, 1], label='Graph 2', color='red') plt.legend() fig2.savefig('graph2.pdf') plt.show()
这种方式逻辑清晰,每张图的画布完全独立,不会出现混淆。
2. 用plt.figure()创建新图替代plt.clf()
如果你不想显式管理Figure对象,在绘制第二张图前调用plt.figure()主动创建新画布,而非用plt.clf()清除旧内容:
import matplotlib.pyplot as plt # 第一张图 plt.plot([1, 2, 3], label='Graph 1') plt.legend() plt.savefig('graph1.pdf') plt.show() # 创建新画布,准备绘制第二张图 plt.figure() plt.plot([3, 2, 1], label='Graph 2', color='red') plt.legend() plt.savefig('graph2.pdf') plt.show()
plt.figure()会强制生成一个新的活跃Figure,确保第二张图绘制在全新的画布上,保存时自然是正确的内容。
内容的提问来源于stack exchange,提问作者Teya
相关产品推荐
相关产品推荐

