plt.gcf()无法保存独立绘图实例,如何分别保存不同阶段绘图对象?
解决Matplotlib保存独立绘图实例的问题
这个问题我之前也踩过坑!你遇到的核心问题是:两次调用plt.gcf()获取的其实是同一个Figure对象。因为Matplotlib默认会在同一个画布上叠加绘图,你没有创建新的独立figure,所以fig1和fig2本质上是同一个对象的引用,后面添加的红色曲线会叠加在同一个画布上,自然调用两者时显示的内容完全一致。
正确的解决方案
方法1:每次绘图前创建新的Figure
通过plt.figure()手动生成新的空白画布,这样后续的绘图操作就会在新的figure上进行,保存的fig实例也会是独立的:
import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 10, 0.1) y1 = x y2 = np.sin(x) # 生成第一个独立画布,绘制蓝色直线 plt.figure() plt.plot(x, y1, linewidth=1, color='deepskyblue') fig1 = plt.gcf() # 生成第二个独立画布,先画蓝线再画红线 plt.figure() plt.plot(x, y1, linewidth=1, color='deepskyblue') plt.plot(x, y2, linewidth=1, color='red') fig2 = plt.gcf() # 按需显示绘图 fig1.show() # 仅显示蓝色直线 fig2.show() # 显示两条曲线
方法2:使用面向对象API(推荐)
Matplotlib官方更推荐用面向对象的方式操作,这种方式能更精准地控制每个figure和axes,避免全局状态的干扰:
import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 10, 0.1) y1 = x y2 = np.sin(x) # 创建第一个figure和对应的axes,绘制蓝色直线 fig1, ax1 = plt.subplots() ax1.plot(x, y1, linewidth=1, color='deepskyblue') # 创建第二个figure和对应的axes,绘制两条曲线 fig2, ax2 = plt.subplots() ax2.plot(x, y1, linewidth=1, color='deepskyblue') ax2.plot(x, y2, linewidth=1, color='red') # 按需显示 fig1.show() fig2.show()
额外说明
- 如果是在Jupyter Notebook环境中,记得先运行
%matplotlib inline(用于静态显示)或者%matplotlib notebook(交互式显示),否则可能需要调用plt.show()来触发显示。 - 面向对象的方式不仅能解决你的问题,后续修改绘图元素(比如添加坐标轴标签、调整图例、设置刻度)时,也能更清晰地定位到对应的绘图实例,避免混乱。
内容的提问来源于stack exchange,提问作者Borna Arabkhedri
相关产品推荐
相关产品推荐

