酸洗Matplotlib情节提升PicklingError:不能腌制'RendererAgg'对象

时间:2015-02-13 19:52:55

标签: python matplotlib pickle figure dill

我有一个程序可以使用matplotlib创建绘图 - 有时是线图,有时是NonUniformImages。我希望能够在以后重新打开这些情节,而无需再次完成整个创作过程。无论出于何种原因,它不断抛出PicklingError: Can't pickle 'RendererAgg' object。我尝试过使用import dill as pickleimport pickle,以及所有4种不同的酸洗选项,但没有变化。

轴在这里定义:

class Imaging:
    def function:
        ax1 = plt.subplot(2,1,1)
        ax2 = plt.subplot(2,1,2)

并在此处设置:( Imaging.figureProperties是一个列表,用于保存多个[ax1,ax2]个对象。也与定义ax1ax2的函数相同。)< / p>

Imaging.figureProperties.append([ax1,ax2])

最后,数据在这里被腌制(用户选择了i,但它将在列表中):

class2:
    with open(filename, 'wb') as f:
        pickle.dump(Imaging.figureProperties[i-1],f)

我运行this question中的示例代码没有问题(只需稍加更改,例如在'wb'中打开而不只是'w'),只要我使用{{1} }。如果我使用标准import dill as pickle,它会抛出相同的import pickle。这是怎么回事?

2 个答案:

答案 0 :(得分:2)

我是dill作者。如果您编辑问题以提供可以测试的代码,我可以更好地测试您的代码。我想你上面的代码中可能只有拼写错误 - 它应该是def function(self):。还有什么是class2:?我只是切入追逐并序列化你要序列化的东西。您发布的代码并没有多大意义。

>>> import matplotlib.pyplot as plt
>>> 
>>> class Imaging:
...   def function(self):
...     ax1 = plt.subplot(2,1,1)
...     ax2 = plt.subplot(2,1,2)
... 
>>> Imaging.figureProperties = []
>>> 
>>> import dill
>>>                                     
>>> ax1 = plt.subplot(2,1,1)
>>> ax2 = plt.subplot(2,1,2)
>>> Imaging.figureProperties.append([ax1, ax2])
>>> fp = dill.loads(dill.dumps(Imaging.figureProperties[0]))
>>> fp   
[<matplotlib.axes._subplots.AxesSubplot object at 0x113085320>, <matplotlib.axes._subplots.AxesSubplot object at 0x113471eb8>]

当您使用它时,您正在使用的类非常没用,但是您要求序列化的代码会进行序列化。

答案 1 :(得分:1)

将Matplotlib更新为1.4.2解决了这些问题。