存储和重新加载matplotlib.pyplot对象
我在一个伪操作环境中工作,我们会在收到数据后制作新的图像。有时候,当新数据到达时,我们需要重新打开一张图像,并更新这张图像,以便创建合成图、添加覆盖层等等。除了添加内容到图像中,这还需要修改标题、图例等。
请问matplotlib里面有没有什么功能,可以让我保存和重新加载我的matplotlib.pyplot对象,以便以后使用?这需要能够保持对所有相关对象的访问,包括图形、线条、图例等等。也许pickle是我需要的,但我对此不太确定。
5 个回答
我用matplotlib为很多论文制作了图表。我不是像在MATLAB里那样直接保存图表,而是写了一个脚本,先绘制数据,然后再格式化和保存图表。如果我想保留一份数据的本地副本(特别是想再次使用的时候),我发现numpy.savez()和numpy.load()非常有用。
刚开始的时候,我觉得MATLAB里保存图表的方式很方便,但过了一段时间后,我更喜欢这种方法,因为它把数据以一种可以进一步分析的格式保存了下来。
这是对Pelson回答的小修改,适合在Jupyterhub上工作的人。
在加载pickle文件之前,使用%matplotlib notebook
。我发现使用%matplotlib inline
在Jupyterhub和Jupyter notebook中都不管用,最后会出现一个错误,提示内容是:AttributeError: 'module' object has no attribute 'new_figure_manager_given_figure'。
import matplotlib.pyplot as plt
import numpy as np
import pickle
%matplotlib notebook
ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
plt.plot(x, y)
with open('myplot.pkl','wb') as fid:
pickle.dump(ax, fid)
然后在一个单独的会话中:
import matplotlib.pyplot as plt
import pickle
%matplotlib notebook
with open('myplot.pkl','rb') as fid:
ax = pickle.load(fid)
plt.show()
从1.2版本开始,matplotlib提供了实验性的“序列化”支持。如果你在使用过程中遇到任何问题,请在mpl的邮件列表上告诉我们,或者在github.com/matplotlib/matplotlib上提交一个问题。
希望这对你有帮助。
编辑: 添加了一个简单的例子
import matplotlib.pyplot as plt
import numpy as np
import pickle
ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
ax.plot(x, y)
pickle.dump(ax, open('myplot.pickle', 'w'))
然后在一个单独的会话中:
import matplotlib.pyplot as plt
import pickle
ax = pickle.load(open('myplot.pickle'))
plt.show()