Get the list of figures in matplotlib

PythonMatplotlib

Python Problem Overview


I would like to:

pylab.figure()
pylab.plot(x)
pylab.figure()
pylab.plot(y)
# ...
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...

Python Solutions


Solution 1 - Python

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

plt.figure()
plt.plot(x)
plt.figure()
plt.plot(y)

for i in plt.get_fignums():
    plt.figure(i)
    plt.savefig('figure%d.png' % i)
    

Solution 2 - Python

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

import matplotlib.pyplot as plt
figs = list(map(plt.figure, plt.get_fignums()))

Solution 3 - Python

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

x=np.random.random((10,10))
y=np.random.random((10,10))
pylab.figure()
pylab.plot(x)
pylab.figure()
pylab.plot(y)

figures=[manager.canvas.figure         for manager in matplotlib._pylab_helpers.Gcf.get_all_fig_managers()]
print(figures)

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

for i, figure in enumerate(figures):
    figure.savefig('figure%d.png' % i)

Solution 4 - Python

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)
etc...
>> for fig in mylist:
>>     fig.savefig()

Solution 5 - Python

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
plot_some_stuff()
# find all figures
figures = []
for i in range(maximum_number_of_possible_figures):
    fig = plt.figure(i)
    if fig.axes:
        figures.append(fig)
    else:
        break

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

Solution 6 - Python

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 = []
figures.append(plt.figure(num='map'))
# Make a bunch of figures ...
assert figures[0].get_label() == 'map'

for figure in figures:
    figure.savefig('{0}.png'.format(figure.get_label()))

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEvgenyView Question on Stackoverflow
Solution 1 - PythonMatti PastellView Answer on Stackoverflow
Solution 2 - PythonkrollspellView Answer on Stackoverflow
Solution 3 - PythonunutbuView Answer on Stackoverflow
Solution 4 - PythonjoaquinView Answer on Stackoverflow
Solution 5 - PythonmcstrotherView Answer on Stackoverflow
Solution 6 - PythonWesley BaughView Answer on Stackoverflow