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