我在一个psudo-operational环境中工作,我们在接收数据时创建新的图像。有时,当新数据进入时,我们需要重新打开图像并更新该图像,以便创建合成,添加叠加等。除了添加到图像之外,还需要修改标题,图例等。
matplotlib中是否有内容可以让我存储和重新加载我的matplotlib.pyplot对象供以后使用?它需要保持对所有相关对象的访问,包括数字,线条,图例等。也许泡菜是我正在寻找的,但我对此表示怀疑。
答案 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