Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AttributeError while trying to load the pickled matplotlib figure

I used pickle to dump matplotlib figure as shown in an answer in SO. Below is the code snippet-

import pickle
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1,2,3],[10,-10,30])
pickle.dump(fig, open('fig.pickle', 'wb'))

Below is the code snippet to load the pickled figure-

import pickle
figx = pickle.load(open('fig.pickle', 'rb'))
figx.show()

The above code shows following error-

AttributeError: 'NoneType' object has no attribute 'manager'
Figure.show works only for figures managed by pyplot, normally created by pyplot.figure().

I am using Python 3.6.3 on Ubuntu 14.04 LTS 64 Bit OS. Below are the more details of my environment-

> import matplotlib
> matplotlib.__version__
'2.1.0'
> matplotlib.get_backend()
'Qt5Agg'
> import sys
> sys.version_info
sys.version_info(major=3, minor=6, micro=3, releaselevel='final', serial=0)

PS: My questions seem similar to this question asked at SO. However, it is different since the provided answer is not running and throwing exceptions.

like image 858
Ravi Joshi Avatar asked Dec 18 '22 00:12

Ravi Joshi


1 Answers

You need a canvas manager before you can show your figure. The same concept from question Matplotlib: how to show a figure that has been closed applies, you can create a function to make a dummy figure and steal its manager, as below (credit to Jean-Sébastien who wrote the answer above).

def show_figure(fig):

    # create a dummy figure and use its
    # manager to display "fig"  
    dummy = plt.figure()
    new_manager = dummy.canvas.manager
    new_manager.canvas.figure = fig
    fig.set_canvas(new_manager.canvas)

With this function you can then run:

show_figure(figx)
figx.show()
like image 183
Nathan Kiner Avatar answered Dec 27 '22 02:12

Nathan Kiner