2011-11-21 6 views
5

Entiendo cómo mostrar los trazados de matplotlib en la pantalla usando la interfaz de pyplot (¡creo!). Empecé a trazar en un programa de subprocesos múltiples, y esto comenzó a causar errores, por lo que estoy tratando de cambiar a la interfaz orientada a objetos. Puedo hacer una gráfica simple y guardarla en un archivo usandoDibujar trazados en la pantalla usando matplotlib API

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 

fig = Figure() 
can = FigureCanvas(fig) 
ax = fig.add_subplot(111) 
ax.plot((1,2,3)) 
can.print_figure('test') 

Pero, ¿cómo puedo visualizar esta gráfica en la pantalla? He visto otro código que usa can.draw() pero eso no tiene ningún efecto.

También, por favor avíseme si hay algo subóptimo sobre mi código anterior - Realmente no he entendido lo que hacen todos estos objetos de figura, lona y hacha.

Respuesta

4

Su problema es que usted está utilizando un motor no interactivo (Agg en lugar de TkAgg, GtkAgg, QtAgg, etc). Por definición, no es compatible con la pantalla.

Sin embargo, trabajar con código multiproceso con cualquier biblioteca gui requerirá que el mainloop de la interfaz se ejecute en su propio hilo.

En otras palabras, cambiar a un servidor que pueda mostrarse en la pantalla requerirá una complejidad un poco mayor en su código multiproceso.

Existen varias formas diferentes de hacerlo, pero cualquier método genérico será muy ineficiente. (La solución más sencilla es utilizar pyplot.ion y luego dibujar el lienzo cada x milisegundos en un hilo mientras hace otras cosas en otro hilo. Esta es terriblemente ineficiente.)

¿Puede dar un poco más de detalle acerca de lo que' Reing? ¿Por qué estás usando threading en lugar de multiprocesamiento? (es decir, ¿estás haciendo mucho IO?) ¿Qué biblioteca de GUI estás usando? (Si no lo sabe, entonces probablemente sea Tk, ya que ese es el backend matplotlib predeterminado).

+0

Muchas gracias por su ayuda. No me había dado cuenta de que la respuesta sería específica del servidor (traté de averiguar qué estaba haciendo 'pyplot.show()', pero no pude encontrar el código correspondiente). Encontré [este] (http://matplotlib.sourceforge.net/examples/user_interfaces/embedding_in_tk.html) ejemplo para Tk, que es muy útil. Mencionar el multihilo fue probablemente una pista falsa (solo tenía un código que hacía algunos números) y guardé algunas tramas con pyplot, traté de mover esto a un hilo para poder ver sus resultados mientras estaba corriendo, y obtuve un montón de rarezas errores – James

Cuestiones relacionadas