【问题标题】:Pickle figures from matplotlib来自 matplotlib 的泡菜数字
【发布时间】:2016-02-26 10:44:32
【问题描述】:

我正在尝试从问题中重新创建简单的泡菜图示例:Saving interactive Matplotlib figures, 这也来自Saving Matplotlib Figures Using Pickle。但是,当我运行给定的代码时,数字似乎可以腌制,但是当我尝试加载腌制的数字时出现错误。我正在使用 Canopy Enthought (v1.6.2.3262) 运行它,在 Python 2.7.3-1 上使用 Matplotlib 1.5.1-1 和 Numpy 1.9.2-3。 泡菜代码是:`

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

我知道 Python 3 和 2 之间存在差异,在 Python 2 的转储中应该使用该文件而不是 open (我假设是 pickle 加载),所以我在代码中尝试了这两种组合。

我不确定错误告诉我什么,因此我无法进一步了解此问题,感谢您对理解错误或解决问题的任何帮助。

【问题讨论】:

  • 嗯,它看起来可能是一个微妙的错误......在你 load 之前尝试 import copy_reg。如果可行,那么您应该将错误报告给matplotlib。然后我希望dill 和/或cloudpickle 可以正确处理对象,而无需您进行额外的导入。
  • 谢谢 Mike,我试过了,但没用,但它让我进一步调查了 copy_reg 错误,我发现我需要在初始 pickle 中明确写入二进制文件以获得如ImportError: No module named copy_reg pickle 中所述,它可以工作(因为我只使用了 w,而不是 wb)。不确定 stackoverflow 上的协议 - 我应该上传自己的答案吗?
  • 啊,这很有道理……您应该发布您对自己问题的答案。

标签: python numpy matplotlib pickle figure


【解决方案1】:

copy_reg 的错误是由代码中的写入格式导致的,正确的代码应该在 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 错误和另一个问题ImportError: No module named copy_reg pickle 中提供的解决方案确定的,该问题是关于酸洗时的 copy_reg 错误。

【讨论】:

  • 不,在执行with open('....pickle', 'rb') as f: p = pickle.load(f) 时,情节是任何快照,但不再是交互式情节!腌制的 3d 或交互式绘图无法与之交互! github.com/matplotlib/matplotlib/issues/10843
猜你喜欢
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2012-06-06
  • 2018-07-29
  • 1970-01-01
  • 2012-01-23
相关资源
最近更新 更多