Get the list of figures in matplotlib

前端 未结 6 2108
南旧
南旧 2020-11-30 01:36

I would like to:

pylab.figure()
pylab.plot(x)
pylab.figure()
pylab.plot(y)
# ...
for i, figure in enumerate(pylab.MagicFunctionReturnsListOfAllFigures()):
           


        
相关标签:
6条回答
  • 2020-11-30 02:08

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

    import matplotlib.pyplot as plt
    figs = list(map(plt.figure, plt.get_fignums()))
    
    0 讨论(0)
  • 2020-11-30 02:12

    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)
    
    0 讨论(0)
  • 2020-11-30 02:18

    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)
    
    0 讨论(0)
  • 2020-11-30 02:27

    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()))
    
    0 讨论(0)
  • 2020-11-30 02:28

    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()
    
    0 讨论(0)
  • 2020-11-30 02:28

    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

    0 讨论(0)
提交回复
热议问题