加载pickle保存的Matplotlib图形时出现AttributeError问题求助
解决Pickle加载Matplotlib图形时的
AttributeError: 'NoneType' object has no attribute 'manager'问题 嘿,这个报错我之前也碰到过!原因很简单:你用pickle存下来的Matplotlib图形对象,加载回来之后没有关联图形管理器(figure manager)——而Figure.show()方法必须靠这个管理器来创建显示窗口,所以直接调用figx.show()就会炸锅。
下面给你两种实用的解决办法:
方案1:用plt.show()代替图形对象的show()
这是最简单的方法,不用折腾管理器,直接用Matplotlib的pyplot模块来显示所有当前存在的图形,它会自动为加载的图形补上所需的管理器:
import pickle import matplotlib.pyplot as plt # 加载pickle里的图形 figx = pickle.load(open('fig.pickle', 'rb')) # 直接调用plt.show()就能显示图形了 plt.show()
方案2:手动给图形加个管理器(适合需要精细控制的场景)
如果你需要对窗口显示做更多自定义(比如调整窗口大小、绑定事件),可以手动为加载的图形创建并关联一个管理器。这里以Tkinter后端为例:
import pickle import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, FigureManagerTkAgg import tkinter as tk # 初始化Tkinter窗口 root = tk.Tk() root.title("加载的Pickle图形") # 加载图形 figx = pickle.load(open('fig.pickle', 'rb')) # 创建画布和管理器 canvas = FigureCanvasTkAgg(figx, master=root) manager = FigureManagerTkAgg(canvas, 1, root) manager.canvas.draw() # 把图形放到窗口里显示 canvas.get_tk_widget().pack(fill=tk.BOTH, expand=1) tk.mainloop()
如果你的Matplotlib用的是Qt等其他后端,只需要替换对应的后端类就行(比如FigureCanvasQTAgg和FigureManagerQTAgg)。
最后补个小提醒:如果只是想修改图形或者重新保存成图片,根本不用显示它——直接对figx做修改(比如ax = figx.gca(); ax.plot([4,5],[20,15])),然后调用figx.savefig('updated_fig.png')就搞定了,完全不需要调用show()~
内容的提问来源于stack exchange,提问作者ravi
相关产品推荐
相关产品推荐

