Python 从matplotlib中Pickle图形

Python 从matplotlib中Pickle图形,python,numpy,matplotlib,pickle,figure,Python,Numpy,Matplotlib,Pickle,Figure,我试图根据以下问题重新创建一个简单的pickle图形示例:, 这也是来源于。然而,当我运行给定的代码时,这些图形看起来是pickle OK,但是当我尝试加载pickle图形时,我得到了一个错误。我使用Canopy Enthow(v1.6.2.3262)运行它,在Python 2.7.3-1上使用Matplotlib 1.5.1-1和Numpy 1.9.2-3。 pickle代码是:` import numpy as np import matplotlib.pyplot as plt impor

我试图根据以下问题重新创建一个简单的pickle图形示例:, 这也是来源于。然而,当我运行给定的代码时,这些图形看起来是pickle OK,但是当我尝试加载pickle图形时,我得到了一个错误。我使用Canopy Enthow(v1.6.2.3262)运行它,在Python 2.7.3-1上使用Matplotlib 1.5.1-1和Numpy 1.9.2-3。 pickle代码是:`

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

# Plot simple sinus function
fig_handle = plt.figure()
x = np.linspace(0,2*np.pi)
y = np.sin(x)
plt.plot(x,y)

# Save figure handle to disk
pl.dump(fig_handle,file('sinus.pickle','w'))`
加载图形的代码为:

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

# Load figure from disk and display
fig_handle = pl.load(open('sinus.pickle','rb'))
fig_handle.show()
我得到的错误是:

%run "Z:\EFNHigh_Res\show_picklefig.py"
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
Z:\EFNHigh_Res\show_picklefig.py in <module>()
      4 
      5 #plot simple sinus function
----> 6 fig_handle = pl.load(open('Z:\EFNHigh_Res\sinus.pickle','rb'))
      7 fig_handle.show()

C:\Users\Tom\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.6.2.3262.win-x86_64\lib\pickle.pyc in load(file)
   1376 
   1377 def load(file):
-> 1378     return Unpickler(file).load()
   1379 
   1380 def loads(str):

C:\Users\Tom\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.6.2.3262.win-x86_64\lib\pickle.pyc in load(self)
    856             while 1:
    857                 key = read(1)
--> 858                 dispatch[key](self)
    859         except _Stop, stopinst:
    860             return stopinst.value

C:\Users\Tom\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.6.2.3262.win-x86_64\lib\pickle.pyc in load_global(self)
   1088         module = self.readline()[:-1]
   1089         name = self.readline()[:-1]
-> 1090         klass = self.find_class(module, name)
   1091         self.append(klass)
   1092     dispatch[GLOBAL] = load_global

C:\Users\Tom\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.6.2.3262.win-x86_64\lib\pickle.pyc in find_class(self, module, name)
   1122     def find_class(self, module, name):
   1123         # Subclasses may override this
-> 1124         __import__(module)
   1125         mod = sys.modules[module]
   1126         klass = getattr(mod, name)

ImportError: No module named copy_reg
%运行“Z:\EFNHigh\u Res\show\u picklefigh.py”
---------------------------------------------------------------------------
ImportError回溯(最近一次呼叫最后一次)
Z:\EFNHigh\u Res\show\u picklef.py in()
4.
5#绘制简单窦功能图
---->6 fig_handle=pl.load(打开('Z:\EFNHigh_Res\sinus.pickle','rb'))
图7\u手柄显示()
C:\Users\Tom\AppData\Local\enthught\Canopy\App\AppData\Canopy-1.6.2.3262.win-x86\u 64\lib\pickle.pyc处于加载状态(文件)
1376
1377 def加载(文件):
->1378返回Unpickler(file.load())
1379
1380 def负载(str):
C:\Users\Tom\AppData\Local\enthught\Canopy\App\AppData\Canopy-1.6.2.3262.win-x86\u 64\lib\pickle.pyc处于加载状态(self)
856而1:
857键=读取(1)
-->858调度[键](自身)
859除_Stop,stopinst外:
860返回stopinst.value
C:\Users\Tom\AppData\Local\enthught\Canopy\App\AppData\Canopy-1.6.2.3262.win-x86\u 64\lib\pickle.pyc在load\u global(self)中
1088 module=self.readline()[:-1]
1089 name=self.readline()[:-1]
->1090 klass=self.find_类(模块,名称)
1091自我附加(klass)
1092调度[全局]=加载\u全局
C:\Users\Tom\AppData\Local\enthught\Canopy\App\AppData\Canopy-1.6.2.3262.win-x86\u 64\lib\pickle.pyc在find\u类中(self、module、name)
1122 def find_类(自身、模块、名称):
1123#子类可以覆盖此
->1124导入(模块)
1125模块=系统模块[模块]
1126 klass=getattr(mod,name)
ImportError:没有名为copy_reg的模块
我知道Python3和Python2之间有一个区别,在Python2的转储(我假设是pickle加载)中应该使用file而不是open,所以我在代码中尝试了这两种组合


我不确定错误告诉我的是什么,因此我无法得到进一步的帮助,无法理解错误或解决问题。

copy_reg的错误是由代码中的写入格式导致的,以pickle该图形,正确的代码应该在write语句中包含wb而不是w,如中所示:

# Save figure handle to disk
import pickle
with open('sinus.pickle', 'wb') as f: # should be 'wb' rather than 'w'
    pickle.dump(fig_handle, f) 

这是根据copy_reg错误和关于酸洗时copy_reg错误的另一个问题中提供的解决方案确定的。

Hmm,这看起来可能是一个微妙的错误…请在加载
之前尝试
导入copy_reg
。如果这样做有效,那么您应该将错误报告给
matplotlib
。然后我希望
dill
和/或
cloudpickle
能够正确处理对象,而无需您进行额外的导入。谢谢Mike,我尝试了,但没有成功,但这让我进一步调查了copy\u reg错误,我发现我需要在最初的pickle中显式地写入二进制文件以使其工作(因为我只使用了w,而不是wb),如中所述。不确定stackoverflow上的协议-我应该上传我自己的答案吗?啊,这很有意义…你应该将你的答案发布到你自己的问题上。不,当使用open(“…pickle”,“rb”)执行
时,作为f:p=pickle.load(f)
,绘图是任何快照,但不再是交互式绘图!pickled 3d或交互式绘图无法与交互!