2012-02-14 19 views
37

Tengo un script de python simple que traza algunos gráficos en la misma figura. Todos los gráficos son creados por draw() y al final llamo a la función show() para bloquear.Matplotlib python show() devuelve inmediatamente

El script solía funcionar con Python 2.6.6, Matplotlib 0.99.3 y Ubuntu 11.04. Intenté ejecutarlo en Python 2.7.2, Matplotlib 1.0.1 y Ubuntu 11.10 pero la función show() regresa inmediatamente sin esperar a matar la figura.

¿Esto es un error? ¿O una nueva característica y tendremos que cambiar nuestros scripts? ¿Algunas ideas?

EDIT: Mantiene la trama abierta en modo interactivo, es decir, python -i ..., pero solía funcionar sin eso, y trató de tener plt.ion() en el script y ejecutarlo en modo normal pero sin suerte.

+4

El código es el tema principal de SO. Danos algunos – joaquin

+0

Estás en lo correcto. Traté de reproducirlo con un ejemplo más simple pero no pude. Trataré de recortar el código y resaltar el origen del problema. – gpierris

+0

una solución podría estar usando un raw_input() en la última línea del script – joaquin

Respuesta

29

Creo que con show(block=True) debería solucionar su problema.

+1

Gracias por la respuesta, pero no. Probablemente esa era una versión anterior. Simplemente me dice que el bloqueo fue un argumento inesperado. – gpierris

+1

@gpierris 'block' argumento para' mostrar' existe al menos en matplotlib 1.1.0. Sin embargo, el valor predeterminado es bloquear, por lo que si no cambió el modo anteriormente en el código, establecerlo en True no es relevante – joaquin

+5

usando 'plt.show (block = True)' lo hizo por mí. –

40

Tuve el mismo problema, y ​​fue provocado llamando al show() en el objeto Figure en lugar del objeto pyplot.

Código incorrecto. Hace que el gráfico que parpadee en la pantalla por un breve instante:

import matplotlib.pyplot as plt 

    x = [1,2,3] 
    y = [5,6,7] 

    fig = plt.figure() 
    plt.plot(x, y) 

    fig.show() 

última línea debe ser el siguiente para mostrar el gráfico hasta que es despedido:

plt.show() 
6

Tenía el inverse problem, y parece que matplotlib funcionará en modo interactivo o no interactivo en función de una serie de cosas que no pude rastrear (una vía en IDLE, otra en la consola del sistema, una vía en la consola spyder normal, otra en una dedicada ...)

Esto funcionó para mí:

import matplotlib 
matplotlib.interactive(False) 

(En realidad, querían modo interactivo, pero en su caso la inversa debería ayudar.) ion() y ioff() debería hacer lo mismo pero lo anterior es en el nivel de matplotlib, no sólo pyplot o pylab. Esto funciona para mí aunque estoy (más tarde) importando pyplot por separado y nunca vuelva a llamar a matplotlib como tal. Estoy pensando que plt.ion() solo tiene un efecto en pyplot, no otros componentes de matplotlib que pueden o no estar involucrados cuando se usa pyplot.

Este método funciona para mí en Windows 7, usando Python 2.65 con matplotlib 0.99 y Python 2.75 con matplotlib 1.3.1, en todas las consolas python e IDEs disponibles en ambos sistemas (64 bits, ambos). Sin embargo, no funcionó en Linux (SuSe 11.3, 64 bit), así que definitivamente hay alguna dependencia de la plataforma en juego aquí

3

Para replicar el comportamiento matplotlib.show() con el backend tkagg cuando se llama a show() en el objeto Figura:

import Tkinter as Tk 
import matplotlib.pyplot as plt 
fig = plt.figure() 
... your plot commands... 
fig.show() 
Tk.mainloop() 
+0

Tkinter no es un paquete. es tkinter. – thang

+0

Su ejemplo es correcto para python2, es tkinter en python 3. https://stackoverflow.com/questions/25905540/importerror-no-module-named-tkinter También confirmado, su solución funciona para nuestro caso de uso específico. ¡Gracias! –

Cuestiones relacionadas