Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I include a matplotlib Figure object as subplot? [duplicate]

Tags:

matplotlib

How can I use a matplotlib Figure object as a subplot? Specifically, I have a function that creates a matplotlib Figure object, and I would like to include this as a subplot in another Figure.

In short, here's stripped-down pseudocode for what I've tried:

    fig1 = plt.figure(1, facecolor='white')
    figa = mySeparatePlottingFunc(...)
    figb = mySeparatePlottingFunc(...)
    figc = mySeparatePlottingFunc(...)
    figd = mySeparatePlottingFunc(...)
    fig1.add_subplot(411, figure=figa)
    fig1.add_subplot(412, figure=figb)
    fig1.add_subplot(413, figure=figc)
    fig1.add_subplot(414, figure=figd)
    fig1.show()

Sadly, however, this fails. I know for a fact the individual plots returned from the function invocations are viable--I did a figa.show(),...,figd.show() to confirm that they are OK. What I get for the final line in the above code block--fig1.show()--is a collection of four empty plots that have frames and x- and y- tickmarks/labels.

I've done quite a bit of googling around, and experimented extensively, but it's clear that I've missed something that is either really subtle, or embarrassingly obvious (I'll be happy for it to be the latter as long as I can get un-stuck).

Thanks for any advice you can offer!

like image 452
user2401472 Avatar asked May 25 '13 14:05

user2401472


People also ask

How do I create a double subplot in Matplotlib?

To create multiple plots use matplotlib. pyplot. subplots method which returns the figure along with Axes object or array of Axes object. nrows, ncols attributes of subplots() method determine the number of rows and columns of the subplot grid.

What will PLT subplot 333 do?

subplot(333) do? Create a blank plot that fills the figure. Create a plot with three points at location (3,3). Create a smaller subplot in the topleft of the figure.

What does PLT subplot 1 2 2 mean?

The subplot() Function #the figure has 1 row, 2 columns, and this plot is the first plot. plt.subplot(1, 2, 2) #the figure has 1 row, 2 columns, and this plot is the second plot.

How do you add a figure in AxesSubplot?

Looking at the matplotlib documentation, it seems the standard way to add an AxesSubplot to a Figure is to use Figure. add_subplot : from matplotlib import pyplot fig = pyplot. figure() ax = fig.


1 Answers

You can't put a figure in a figure.

You should modify your plotting functions to take axes objects as an argument.

I am also unclear why the kwarg figure is there, I think it is an artifact of the way that inheritance works, the way that the documentation is auto-generated, and the way some of the getter/setter work is automated. If you note, it says figure is undocumented in the Figure documentation, so it might not do what you want;). If you dig down a bit, what that kwarg really controls is the figure that the created axes is attached too, which is not what you want.

In general, moving existing axes/artists between figures is not easy, there are too many bits of internal plumbing that need to be re-connected. I think it can be done, but will involving touching the internals and there is no guarantee that it will work with future versions or that you will get warning if the internals change in a way that will break it.

You need to your plotting functions to take an Axes object as argument. You can use a pattern like:

def myPlotting(..., ax=None):
    if ax is None:
        # your existing figure generating code
        ax = gca()

so if you pass in an Axes object it gets drawn to (the new functionality you need), but if you don't all of your old code will work as expected.

like image 97
tacaswell Avatar answered Sep 17 '22 17:09

tacaswell