python matplotlib

subplot title python



matplotlib: ¿puedo crear objetos AxesSubplot y luego agregarlos a una instancia de Figure? (3)

A continuación, se muestra cómo "mover" un eje de una figura a otra. Esta es la funcionalidad prevista del último ejemplo de @ JoeKington , que en versiones más nuevas de matplotlib ya no funciona, porque los ejes no pueden vivir en varias figuras a la vez.

Primero deberías quitar los ejes de la primera figura, luego anexarla a la siguiente figura y darle un lugar para vivir.

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

Al matplotlib documentación de matplotlib , parece que la forma estándar de agregar un AxesSubplot a una Figure es usar Figure.add_subplot :

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

Me gustaría poder crear objetos similares a AxesSubPlot independientemente de la figura, para poder usarlos en diferentes figuras. Algo como

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)

¿Es esto posible en matplotlib y si es así, cómo puedo hacer esto?

Actualización: No he logrado desacoplar la creación de Ejes y Figuras, pero siguiendo los ejemplos en las respuestas a continuación, puede reutilizar fácilmente los ejes creados previamente en instancias nuevas o de Figura olf. Esto se puede ilustrar con una simple función:

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


Normalmente, solo pasa la instancia de ejes a una función.

Por ejemplo:

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

Para responder a tu pregunta, siempre puedes hacer algo como esto:

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

Además, puedes simplemente agregar una instancia de ejes a otra figura:

import matplotlib.pyplot as plt fig1, ax = plt.subplots() ax.plot(range(10)) fig2 = plt.figure() fig2.axes.append(ax) plt.show()

Cambiar el tamaño para que coincida con otras "formas" subplot también es posible, pero se convertirá rápidamente en más problemas de lo que vale. El enfoque de simplemente pasar una instancia de figura o eje (o lista de instancias) es mucho más simple para casos complejos, en mi experiencia ...


Para gráficos de líneas, puede tratar los objetos Line2D sí mismos:

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