Подтвердить что ты не робот

Matplotlib: могу ли я создать объекты AxesSubplot, а затем добавить их в экземпляр Figure?

Рассматривая документацию matplotlib, кажется, что стандартный способ добавления AxesSubplot в Figure заключается в использовании Figure.add_subplot:

from matplotlib import pyplot

fig = pyplot.figure()
ax = fig.add_subplot(1,1,1)
ax.hist( some params .... )

Я хотел бы иметь возможность создавать объекты AxesSubplot -like независимо от фигуры, поэтому я могу использовать их на разных рисунках. Что-то вроде

fig = pyplot.figure()
histoA = some_axes_subplot_maker.hist( some params ..... )
histoA = some_axes_subplot_maker.hist( some other params ..... )
# make one figure with both plots
fig.add_subaxes(histo1, 211)
fig.add_subaxes(histo1, 212)
fig2 = pyplot.figure()
# make a figure with the first plot only
fig2.add_subaxes(histo1, 111)

Возможно ли это в matplotlib, и если да, то как я могу это сделать?

Обновление: Мне не удалось отделить создание осей и фигур, но, следуя приведенным ниже примерам, можно легко повторно использовать ранее созданные оси в новых экземплярах или olf Figure. Это можно проиллюстрировать простой функцией:

def plot_axes(ax, fig=None, geometry=(1,1,1)):
    if fig is None:
        fig = plt.figure()
    if ax.get_geometry() != geometry :
        ax.change_geometry(*geometry)
    ax = fig.axes.append(ax)
    return fig
4b9b3361

Ответ 1

Как правило, вы просто передаете экземпляр осей функции.

Например:

import matplotlib.pyplot as plt
import numpy as np

def main():
    x = np.linspace(0, 6 * np.pi, 100)

    fig1, (ax1, ax2) = plt.subplots(nrows=2)
    plot(x, np.sin(x), ax1)
    plot(x, np.random.random(100), ax2)

    fig2 = plt.figure()
    plot(x, np.cos(x))

    plt.show()

def plot(x, y, ax=None):
    if ax is None:
        ax = plt.gca()
    line, = ax.plot(x, y, 'go')
    ax.set_ylabel('Yabba dabba do!')
    return line

if __name__ == '__main__':
    main()

Чтобы ответить на ваш вопрос, вы всегда можете сделать что-то вроде этого:

def subplot(data, fig=None, index=111):
    if fig is None:
        fig = plt.figure()
    ax = fig.add_subplot(index)
    ax.plot(data)

Кроме того, вы можете просто добавить экземпляр осей к другому рисунку:

import matplotlib.pyplot as plt

fig1, ax = plt.subplots()
ax.plot(range(10))

fig2 = plt.figure()
fig2.axes.append(ax)

plt.show()

Изменение размера его в соответствии с другими "фигурами" подзаголовка также возможно, но оно быстро станет больше проблем, чем того стоит. Подход простого прохождения экземпляра фигуры или осей (или списка экземпляров) намного проще для сложных случаев, по моему опыту...

Ответ 2

Для графиков строк вы можете иметь дело с объектами Line2D:

fig1 = pylab.figure()
ax1 = fig1.add_subplot(111)
lines = ax1.plot(scipy.randn(10))

fig2 = pylab.figure()
ax2 = fig2.add_subplot(111)
ax2.add_line(lines[0])

Ответ 3

Ниже показано, как "перемещать" оси с одной фигуры на другую. Это предполагаемая функциональность @JoeKington последнего примера, которая в новых версиях matplotlib больше не работает, потому что оси не могут жить сразу несколькими фигурами.

Сначала вам нужно удалить оси с первой фигуры, а затем добавить ее к следующей фигуре и дать ей некоторое место для жизни.

import matplotlib.pyplot as plt

fig1, ax = plt.subplots()
ax.plot(range(10))
ax.remove()

fig2 = plt.figure()
ax.figure=fig2
fig2.axes.append(ax)
fig2.add_axes(ax)

dummy = fig2.add_subplot(111)
ax.set_position(dummy.get_position())
dummy.remove()
plt.close(fig1)

plt.show()