matplotlib: могу ли я создать объекты AxesSubplot, а затем добавить их в экземпляр Figure? - PullRequest
56 голосов
/ 10 июня 2011

Глядя на документацию 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 -подобные объекты независимо от фигуры, поэтому я могу использовать их на разных фигурах.Что-то вроде

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 и если да, то как я могу это сделать?

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

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

Ответы [ 3 ]

25 голосов
/ 10 июня 2011

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

Например:

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()

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

10 голосов
/ 24 октября 2017

Ниже показано, как «перемещать» оси от одной фигуры к другой. Это предназначенная функциональность последнего примера @ 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()
4 голосов
/ 10 июня 2011

Для линейных графиков вы можете иметь дело с самими 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...