2015-02-13 2 views
1

У меня есть программа, которая создает сюжеты - иногда линии, иногда NonUniformImages - с использованием matplotlib. Я бы хотел, чтобы я смог расчистить сюжеты, чтобы снова открыть их позже, не пройдя весь процесс создания. По какой-то причине он продолжает бросать PicklingError: Can't pickle 'RendererAgg' object. Я пробовал использовать как import dill as pickle, так и import pickle, а также все 4 различных варианта травления, но без изменений.Pickling Matplotlib plot raise PicklingError: Невозможно рассолить объект «RendererAgg»

Оси определены здесь:

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

И установить здесь: (Imaging.figureProperties список и предназначен для хранения множества объектов [ax1,ax2] Кроме того, в той же функции, где ax1 и ax2 определены..)

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

Наконец, данные маринованные здесь (i выбирается пользователем, но это будет в списке):

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

У меня нет проблем работает образец кода из this question (с некоторыми незначительными изменениями, такими как открытие в 'wb' вместо просто 'w'), до тех пор, как я использую import dill as pickle. Если я использую стандарт import pickle, он бросает то же самое PicklingError. Что здесь происходит?

+1

Какая версия mpl? Я думаю, мы недавно очистили кучу этих вещей. – tacaswell

+0

@tcaswell, я использовал 1.4.0. Только что обновлено до 1.4.2. – wes3449

ответ

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>] 

класс используется довольно бессмысленно, как вы используете его, однако код, который вы просите сериализовать ли сериализовать.

+0

Я просто хотел показать общую структуру, поскольку код, который у меня есть, довольно грязный, но теперь я понимаю, что должен был просто загрузить все это в первую очередь. Изменит вопрос. – wes3449

+0

Оказывается, что обновление до 1.4.2 было всем, что мне нужно было сделать ... – wes3449

1

Обновление Matplotlib до 1.4.2 позволило решить проблемы.