2011-08-02 7 views
69

Quiero trazar datos, a continuación, crear una nueva figura y la trama data2, y finalmente volver a la trama original y la trama datos3, un poco como esto:¿Cómo le digo a Matplotlib que cree una segunda (nueva) trama y luego la trama en la anterior?

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 How do I tell matplotlib that I am done with a plot? hace algo similar, pero no del todo! No me deja tener acceso a esa trama original.

Respuesta

90

Si usted se encuentra haciendo cosas como esta regularidad puede valer la pena investigar la interfaz orientada a objetos para matplotlib. En su caso:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(5) 
y = np.exp(x) 
fig1 = plt.figure() 
ax1 = fig1.add_subplot(111) 
ax1.plot(x, y) 

z = np.sin(x) 
fig2 = plt.figure() 
ax2 = fig2.add_subplot(111) 
ax2.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 más fácil de no perder de vista, sobre todo con varias figuras, cada una con múltiples subtramas.

+2

Prefiero el enfoque orientado a objetos, ya que cuando anticipe tener muchas figuras, será más fácil seguirlas utilizando nombres en lugar de números. ¡Gracias! –

+0

Pero, ¿cómo se puede cambiar la etiqueta y los límites del eje con este enfoque? Si uso 'ax1.ylabel' dice que no se encuentra. Lo mismo con 'fig1.ylabel' ... –

+1

@GeorgeDatseris La sintaxis es un poco diferente. Es 'ax1.set_xlabel (" su etiqueta x ")', 'ax1.set_ylabel (" su etiqueta y ")', y 'ax1.set_title (" su título ")'. – simonb

51

Cuando llame al figure, simplemente numere el trazado.

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 que le apetezca (en este caso, a partir de 0), pero si usted no proporciona figura con un número en absoluto cuando se crea una nueva, la numeración automática comience en 1 ("Matlab Style" de acuerdo con los documentos).

+3

Parece que esto funciona en el modo interactivo de matplotlib, mientras que el método de la figura() ... add_subplot() no. ¡Gracias! – chbrown

8

Sin embargo, la numeración comienza en 1, por lo que:

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) 

También, si tiene varios ejes en una figura, como subtramas, utilice el comando axes(h) donde h es la manija de los ejes deseados objeto de centrarse en esos ejes.

(no tiene privilegios de comentario sin embargo, lo siento por nueva respuesta!)

+7

'0' funciona, la numeración _automatic_ acaba de comenzar en' 1', si no le da un número en absoluto. – agf

+0

@agf Ah. Célebre. –

0

Una forma que encontré después de algunos problemas es crear una función que obtiene la matriz data_plot, nombre de archivo y orden como parámetro para crear diagramas de caja de los datos dados en la figura ordenada (diferentes pedidos = figuras diferentes) y guardarlos bajo el nombre del archivo.

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