I would like to:

# ...
for i, figure in enumerate(pylab.MagicFunctionReturnsListOfAllFigures()):
  figure.savefig('figure%d.png' % i)

What is the magic function that returns a list of current figures in pylab?

Websearch didn't help...


Edit: As Matti Pastell's solution shows, there is a much better way: use plt.get_fignums().

import numpy as np
import pylab
import matplotlib._pylab_helpers


         for manager in matplotlib._pylab_helpers.Gcf.get_all_fig_managers()]

# [<matplotlib.figure.Figure object at 0xb788ac6c>, <matplotlib.figure.Figure object at 0xa143d0c>]

for i, figure in enumerate(figures):
    figure.savefig('figure%d.png' % i)
| improve this answer | |
  • 5
    Sure it works, but the underscore in the beginning of _pylab_helpers is a signal that this is not a supported interface and may go away at any time. If there is no published interface and you have a use case for one, please file a feature request. – Jouni K. Seppänen Oct 2 '10 at 7:15
  • @Jouni I've run into the same problem and would like to do just that. Unfortunately the whole host of matplotlib/pyplot/pylab websites isn't all that clear to me. Could you indicate where I could file a feature request? Github? – Michael Clerx May 1 '12 at 12:34
  • Yes, Github (github.com/matplotlib/matplotlib/issues) or possibly on the mailing list (dir.gmane.org/gmane.comp.python.matplotlib.general). – Jouni K. Seppänen May 1 '12 at 16:34
  • If you're going to use _pylab_helpers you can do _pylab_helpers.Gcf.figs.values() which is easier. But yeah, uses internal variables etc, so use Matti's way if you don't mind non-OO interface. – Mark Jan 22 '17 at 21:58

Pyplot has get_fignums method that returns a list of figure numbers. This should do what you want:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(100)
y = -x


for i in plt.get_fignums():
    plt.savefig('figure%d.png' % i)
| improve this answer | |
  • 3
    I'm pretty sure this is the canonical answer to the OP's question, and he should accept it as such. – SABBATINI Luca Aug 7 '13 at 0:34
  • 2
    There is also now a plt.get_figlabels method that can be used in the same way, I used that to include the figure label in the filename on saving it. – Heath Jan 22 '19 at 21:03

The following one-liner retrieves the list of existing figures:

import matplotlib.pyplot as plt
figs = list(map(plt.figure, plt.get_fignums()))
| improve this answer | |
  • 1
    Easily the best answer. – Luke Davis May 19 '18 at 2:44

This should help you (from the pylab.figure doc):

call signature::

figure(num=None, figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k')

Create a new figure and return a :class:matplotlib.figure.Figure instance. If num = None, the figure number will be incremented and a new figure will be created.** The returned figure objects have a number attribute holding this number.

If you want to recall your figures in a loop then a good aproach would be to store your figure instances in a list and to call them in the loop.

>> f = pylab.figure()
>> mylist.append(f)
>> for fig in mylist:
>>     fig.savefig()
| improve this answer | |
  • "The returned figure objects have a number attribute holding this number." Thanks. That's what I was looking for and missed it in the documentation. – Chris Redford Aug 14 '11 at 23:20

Assuming you haven't manually specified num in any of your figure constructors (so all of your figure numbers are consecutive) and all of the figures that you would like to save actually have things plotted on them...

import matplotlib.pyplot as plt
# find all figures
figures = []
for i in range(maximum_number_of_possible_figures):
    fig = plt.figure(i)
    if fig.axes:

Has the side effect of creating a new blank figure, but better if you don't want to rely on an unsupported interface

| improve this answer | |

I tend to name my figures using strings rather than using the default (and non-descriptive) integer. Here is a way to retrieve that name and save your figures with a descriptive filename:

import matplotlib.pyplot as plt
figures = []
# Make a bunch of figures ...
assert figures[0].get_label() == 'map'

for figure in figures:
| improve this answer | |

Your Answer

