¿Cómo le digo a Matplotlib que cree una segunda (nueva) trama, y ​​luego la trama en la anterior?

147

Quiero trazar datos, luego crear una nueva figura y trazar datos2, y finalmente volver a la trama original y trazar datos3, algo así:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

FYI ¿Cómo le digo a matplotlib que he terminado con una trama? hace algo similar, ¡pero no del todo! No me permite tener acceso a esa trama original.

Peter D
fuente

Respuestas:

152

Si te encuentras haciendo cosas como esta regularmente, puede valer la pena investigar la interfaz orientada a objetos para matplotlib. En tu caso:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

Es un poco más detallado, pero es mucho más claro y fácil de rastrear, especialmente con varias figuras cada una con múltiples subtramas.

simonb
fuente
2
Prefiero el enfoque orientado a objetos, ya que cuando preveo tener muchas figuras, será más fácil seguirlas usando nombres en lugar de números. ¡Gracias!
Peter D el
1
Pero, ¿cómo se puede cambiar la etiqueta y los límites del eje con este enfoque? Si lo uso ax1.ylabeldice que no se encuentra. Lo mismo con fig1.ylabel...
George Datseris
3
@GeorgeDatseris La sintaxis es un poco diferente. Es ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")y ax1.set_title("your title").
simonb
1
¿por qué usaste 111?
Yash Sodha
2
@yashSodha: esa es una especificación de estilo de matlab de número de subtramas (filas, columnas, índices). Pero ahora es mucho más fácil de usar plt.subplots(nrows, ncols). Han actualizado el ejemplo.
simonb
120

Cuando llame figure, simplemente numere la trama.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

Editar: Tenga en cuenta que puede numerar las parcelas como lo desee (aquí, comenzando desde 0), pero si no proporciona un número a la figura cuando crea uno nuevo, la numeración automática comenzará en 1("Estilo Matlab" según a los documentos).

agf
fuente
3
Esto parece funcionar en el modo interactivo de matplotlib, mientras que el método figure () ... add_subplot () no. ¡Gracias!
chbrown
@SebMa Por favor, no cambie el código sin entenderlo. Esta respuesta fue específicamente sobre pasar un número al figureque eliminó. Las otras cosas que cambiaste se copiaron de la publicación original y no hubo errores en mi respuesta.
agf
@agf Hola, eliminé el 1interior plt.figure(1)porque pensé que el número se incrementó automáticamente y, por lo tanto, no es necesario. Lo siento.
SebMa
18

Sin embargo, la numeración comienza en 1, entonces:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

Además, si tiene varios ejes en una figura, como subtramas, use el axes(h)comando donde hestá el identificador del objeto de ejes deseado para enfocarse en esos ejes.

(Todavía no tengo privilegios de comentario, ¡perdón por la nueva respuesta!)

Ross B.
fuente
10
0funciona, la numeración automática solo comienza en 1, si no le da un número en absoluto.
agf
0

Una forma que encontré después de algunas dificultades es crear una función que obtenga la matriz data_plot, el nombre del archivo y el orden como parámetro para crear diagramas de caja a partir de los datos dados en la figura ordenada (diferentes órdenes = diferentes figuras) y guardarla bajo el nombre de archivo dado.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
emir
fuente