Skip to content
Advertisement

How to plot using a prewritten library function into a subplot?

I’ve been stumbling around this issue for a while, but today I really want to figure out if it can be done.

Say you have a function from a library that does some plotting, such as:

def plotting_function():
    fig, ax = plt.subplots()
    ax.plot([1,2,3], [2,4,10])
    return fig

If I want to add this single plot multiple times to my own subplots, how could I do this?

I’m not able to change the plotting_function, as it’s from a library, so what I’ve tried is:

fig, axs = plt.subplots(1,3)
for i in range(3):
    plt.sca(axs[i])
    plotting_function()
plt.show()

This results in an empty subplot with the line graphs plotting separate.

Is there any simple answer to this problem? Thanks in advance.

Advertisement

Answer

I think you might be better off to monkey patch plt.subplots(), but it is possible to move a subplot from one figure to another. Here’s an example, based on this post:

import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox


def plotting_function1():
    fig, ax = plt.subplots()
    ax.plot([1,2,3], [2,4,10])
    return fig

def plotting_function2():
    fig, ax = plt.subplots()
    ax.plot([10,20,30], [20,40,100])
    return fig

def main():
    f1 = plotting_function1()
    ax1 = plt.gca()
    ax1.remove()

    f2 = plotting_function2()
    ax2 = plt.gca()
    ax1.figure = f2
    f2.axes.append(ax1)
    f2.add_axes(ax1)

    # These positions are copied from a call to subplots().
    ax1.set_position(Bbox([[0.125, 0.11], [0.477, 0.88]]))
    ax2.set_position(Bbox([[0.55, 0.11], [0.9, 0.88]]))
    plt.show()

main()
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement