存储并重新加载matplotlib.pyplot对象

时间:2011-09-03 00:27:31

标签: python matplotlib

我在一个psudo-operational环境中工作,我们在接收数据时创建新的图像。有时,当新数据进入时,我们需要重新打开图像并更新该图像,以便创建合成,添加叠加等。除了添加到图像之外,还需要修改标题,图例等。

matplotlib中是否有内容可以让我存储和重新加载我的matplotlib.pyplot对象供以后使用?它需要保持对所有相关对象的访问,包括数字,线条,图例等。也许泡菜是我正在寻找的,但我对此表示怀疑。

6 个答案:

答案 0 :(得分:50)

自1.2起,matplotlib附带实验性酸洗支持。如果您遇到任何问题,请通过mpl邮件列表或在github.com/matplotlib/matplotlib上打开问题告诉我们

HTH

编辑:添加了一个简单的示例

import matplotlib.pyplot as plt
import numpy as np
import pickle

ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
plt.plot(x, y)
pickle.dump(ax, file('myplot.pickle', 'w'))

然后在另一场会议中:

import matplotlib.pyplot as plt
import pickle

ax = pickle.load(file('myplot.pickle'))
plt.show()

答案 1 :(得分:10)

Pelson对Jupyterhub工作人员的回答的一个小修改

在加载泡菜之前使用%matplotlib notebook。使用%matplotlib inline在jupyterhub或jupyter笔记本中对我不起作用。并给出一个以。结尾的回溯 AttributeError:'module'对象没有属性'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()

答案 2 :(得分:2)

我使用matplotlib制作了许多论文的数据。我不会考虑保存图形(如在MATLAB中),而是编写一个脚本,绘制数据然后格式化并保存图形。如果我想保留数据的本地副本(特别是如果我想再次使用它),我发现 numpy.savez() numpy.load() 非常有用。

起初我错过了在MATLAB中保存数字的收缩包装感觉,但过了一段时间后我更喜欢这种方法,因为它包含的数据格式可供进一步分析。

答案 3 :(得分:0)

你尝试过pickle模块吗?它将一个对象序列化,将其转储到一个文件中,然后可以从文件中重新加载它。

答案 4 :(得分:0)

我在Python 3.7和Matplotlib 3.1.3中也遇到了问题。

我将数字另存为(简化代码):

fig, ax = plt.subplots()
fig.show() #works fine
list_figs.append(fig)
output = {
    "figures": list_figs
}
with open( f"mPair.pkl", "wb" ) as f:
    pickle.dump( output, f )
res = pickle.load( open( f"mPair.pkl", "rb" ) )
res["figures"][0].show() #does not work

如果我直接显示该图,代码可以正常工作,但是在酸洗/酸洗后我得到:

Traceback (most recent call last):
  File "/Users/xx/opt/anaconda3/envs/nengo3/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3331, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-3-4759ba430504>", line 1, in <module>
    res1[ "fig_post" ].show()
  File "/Users/xx/opt/anaconda3/envs/nengo3/lib/python3.7/site-packages/matplotlib/figure.py", line 438, in show
    "created by pyplot.figure()." % err)
AttributeError: 'NoneType' object has no attribute 'manager'
Figure.show works only for figures managed by pyplot, normally created by pyplot.figure()

答案 5 :(得分:0)

在 jupyter notebook 中测试。

import matplotlib.pyplot as plt
import numpy as np
import pickle

fig, axes = plt.subplots(figsize=(20, 5),nrows=1, ncols=2) 
x,y = np.arange(10), np.random.random(10)
axes[0].plot(x,y)
axes[1].plot(x,y)
plt.show()

# myfname = input("Save figure? [enter filename]: ") 
myfname = 'test'
if (myfname!=''):
    fig.savefig(f'./{myfname}.png')
    print(f'file saved to ./{myfname}.png')
    with open(f'./{myfname}.png.pkl','wb') as fid:
        pickle.dump(fig, fid)
        print(f'pickled to ./{myfname}.png.pkl') 

###################################
####### in a separate session
myfname = 'test'
with open(f'./{myfname}.png.pkl', 'rb') as fh:
    fig_loaded = pickle.load(fh)

print(fig_loaded.axes[0].lines[0].get_data()) # get data
fig_loaded # show fig