2010-03-07 10 views
36

decir que tengo dos figuras en matplotlib, con una parcela por la figura:¿Cómo puedo mostrar las cifras por separado en matplotlib?

import matplotlib.pyplot as plt 

f1 = plt.figure() 
plt.plot(range(0,10)) 
f2 = plt.figure() 
plt.plot(range(10,20)) 

continuación muestro tanto en una sola toma

plt.show() 

¿Hay una manera de mostrar por separado, es decir, para mostrar solo f1?

O mejor: ¿cómo puedo gestionar las figuras por separado como en el siguiente código 'ilusión' (que no funciona):

f1 = plt.figure() 
f1.plot(range(0,10)) 
f1.show() 
+1

Solo un consejo: en general, no es necesario que guarde las cifras (en f1, f2), ya que Matplotlib dibuja en la figura * actual *, que generalmente es la última figura creada. – EOL

+1

@EOL, ¿y si quiero dibujar en la primera figura? – Alcott

+3

Hay varias formas de escribir de nuevo a una figura sin guardarla primero en una variable. Por ejemplo, todas las figuras tienen un "número" (que puede ser un número o una cadena). Por defecto, las figuras obtienen un número. Por lo tanto, 'figure (1)' hace activa la primera figura, etc. Alternativamente, puede crear una figura (sin guardarla) con 'figure ('rank')' y luego volverla a activar más tarde con 'figure (' rango ') '. Dicho esto, el punto de mi comentario fue que en el caso de esta pregunta, no hay absolutamente ninguna necesidad de guardar las cifras, ya que 'plot()' actúa sobre la figura actual (la última creada, aquí). – EOL

Respuesta

36

Claro. Agregue Axes usando add_subplot. (Editado import.) (Editado show.)

import matplotlib.pyplot as plt 
f1 = plt.figure() 
f2 = plt.figure() 
ax1 = f1.add_subplot(111) 
ax1.plot(range(0,10)) 
ax2 = f2.add_subplot(111) 
ax2.plot(range(10,20)) 
plt.show() 

Alternativamente, utilice add_axes.

ax1 = f1.add_axes([0.1,0.1,0.8,0.8]) 
ax1.plot(range(0,10)) 
ax2 = f2.add_axes([0.1,0.1,0.8,0.8]) 
ax2.plot(range(10,20)) 
+0

Esto es exactamente lo que trato de hacer, pero matplotlib.figure parece un módulo, no una clase. ¿Me estoy perdiendo de algo? –

+0

Mi culpa. Ver editar. De hecho, utilizo 'from pylab import figure' más a menudo. Por alguna razón, ese 'pylab.figure' devuelve una figura con el método' show', pero 'matplotlib.figure.Figure' no. Hmm. –

+0

Uff .. :) Aquí estoy usando python 2.5.2 con matplotlib 0.98.1. f1.show() no hace nada, mientras que el segundo show() se queda atascado. Probablemente algo está mal configurado. Sin embargo, en otra máquina utilizo python 2.5.5 y matplotlib 0.99.1.1 y todo funciona bien, así que ... +1 y aceptado, muchas gracias. –

2

Quizás necesita leer sobre interactive usage of Matplotlib. Sin embargo, si va a construir una aplicación, debe usar el API e insertar las figuras en las ventanas de su GUI toolkit (vea examples/embedding_in_tk.py, etc.).

21

Con Matplotlib anterior a la versión 1.0.1, show()should only be called once per program, incluso si parece funcionar en ciertos entornos (algunos backends, en algunas plataformas, etc.).

la función de dibujo relevante es en realidad draw():

import matplotlib.pyplot as plt 

plt.plot(range(10)) # Creates the plot. No need to save the current figure. 
plt.draw() # Draws, but does not block 
raw_input() # This shows the first figure "separately" (by waiting for "enter"). 

plt.figure() # New window, if needed. No need to save it, as pyplot uses the concept of current figure 
plt.plot(range(10, 20)) 
plt.draw() 
# raw_input() # If you need to wait here too... 

# (...) 

# Only at the end of your program: 
plt.show() # blocks 

Es importante reconocer que show() es un bucle infinito, diseñado para manejar eventos en las diferentes figuras (cambiar el tamaño, etc.). Tenga en cuenta que, en principio, las llamadas a draw() son opcionales si llama al matplotlib.ion() al comienzo de la secuencia de comandos (aunque he visto esto fallar en algunas plataformas y backends).

No creo que Matplotlib ofrezca un mecanismo para crear una figura y mostrarla opcionalmente; esto significa que se mostrarán todas las figuras creadas con figure(). Si solo necesita mostrar secuencialmente las figuras (ya sea en la misma ventana o no), puede hacer lo mismo en el código anterior.

Ahora, la solución anterior podría ser suficiente en casos simples, y para algunos backends Matplotlib. Algunos backends son lo suficientemente agradables para permitirle interactuar con la primera figura aunque no haya llamado al show(). Pero, por lo que yo entiendo, no tienen que ser agradables. El enfoque más sólido sería lanzar cada dibujo de figura en un hilo separado, con un show() final en cada hilo. Creo que esto es esencialmente lo que hace IPython.

El código anterior debería ser suficiente la mayor parte del tiempo.

PS: ahora, con Matplotlib versión 1.0.1+, show() se puede llamar varias veces (con la mayoría de los backends).

+0

Edité mi respuesta para usar solo 'show'. Todavía prefiero la forma manual de guardar los ejes individuales y los identificadores, porque me parece que los necesito con frecuencia más adelante. Además, eso es lo que hizo la pregunta inicial. –

+0

Realmente no necesita nombrar las figuras para mostrarlas secuencialmente ... Si guardar el resultado de figure() o no realmente depende de las necesidades específicas de cada uno; Casi nunca lo guardo. – EOL

+1

De acuerdo, es suficiente. Gracias por la información agregada. –

Cuestiones relacionadas