2011-11-22 8 views
6

Estoy usando matplotlib con modo interactivo activado y estoy realizando un cálculo, por ejemplo, una optimización con muchos pasos donde trazo los resultados intermedios en cada paso para la depuración. Estas parcelas a menudo llenan la pantalla y se superponen en gran medida.Obtener parcelas matplotlib para actualizar en el foco del mouse

Mi problema es que durante el cálculo, las figuras que están parcial o totalmente ocluidas no se actualizan cuando hago clic en ellas. Son solo un gris en blanco.

Me gustaría obligar a volver a dibujar si es necesario cuando hago clic en una figura, de lo contrario no es útil para mostrarlo. Actualmente, inserto pdb.set_trace() en el código para poder detenerme y hacer clic en todas las figuras para ver qué está pasando

¿Hay alguna manera de forzar a matplotlib a volver a dibujar una figura cada vez que gana el foco del mouse? o se cambia de tamaño, incluso mientras está ocupado haciendo otra cosa?

Respuesta

0

¿Ha intentado llamar a plt.figure(fig.number) antes de trazar en la figura fig y plt.show() después de trazar una figura? Debería actualizar todas las figuras.

+0

n , No he intentado usar plt.show(). Si observa la documentación sobre su uso (http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show), no parece que tendrá el efecto deseado. – Paul

+0

@Paul Si tiene plt.ion(), show() debería llamar a draw() implícitamente. Asegúrese de ejecutar plt.figure (fig.number) primero, imagina que debería actualizarse automáticamente. –

1

Algo como esto podría funcionar para usted:

import matplotlib.pyplot as plt 
import numpy as np 

plt.ion() # or leave this out and run with ipython --pylab 

# draw sample data 
fig = plt.figure() 
ax = fig.add_subplot(111) 
line, = ax.plot(np.random.rand(10)) 

class Refresher: 
    # look for mouse clicks 
    def __init__(self, fig): 
     self.canvas = fig.canvas 
     self.cid = fig.canvas.mpl_connect('button_press_event', self.onclick) 

    # when there is a mouse click, redraw the graph 
    def onclick(self, event): 
     self.canvas.draw() 

# remove sample data from graph and plot new data. Graph will still display original trace 
line.remove() 
ax.plot([1,10],[1,10]) 

# connect the figure of interest to the event handler 
refresher = Refresher(fig) 
plt.show() 

Esto se volverá a dibujar la figura cada vez que se hace clic en el gráfico.

También puede experimentar con el manejo como

  • ResizeEvent otro evento - la figura lienzo se redimensiona
  • LocationEvent - ratón entra en una nueva figura

cheque más fuera here:

Cuestiones relacionadas