Pickle figures from matplotlib

15,253

The error with copy_reg was being caused by the write format in the code to pickle the figure, the correct code should include wb rather than w in the write statement as in:

# 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) 

This was identified based on the copy_reg error and the solution provided in another question ImportError: No module named copy_reg pickle about copy_reg error when pickling.

Share:
15,253
Admin
Author by

Admin

Updated on June 12, 2022

Comments

  • Admin
    Admin almost 2 years

    I am trying to recreate the simple pickle figure example from the question: Saving interactive Matplotlib figures, which is also sourced from Saving Matplotlib Figures Using Pickle. However, when I run the given codes the figures seems to pickle OK, but then I get an error when I try to load the pickled figure. I am running it using Canopy Enthought (v1.6.2.3262), using Matplotlib 1.5.1-1 and Numpy 1.9.2-3 on Python 2.7.3-1. The pickle code is:`

    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'))`
    

    The code to load the figure is:

    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()
    

    and the error I get is:

    %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
    

    I know that there is a difference between Python 3 and 2, in that file instead of open should be used in the dump (and I presume the pickle load) for Python 2, so I have tried both combinations in the code.

    I am unsure what the error is telling me, so I haven't been able to get any further with this, any help on understanding the errors or fixing the problem appreciated.