Parcela interactiva basada en Tkinter y matplotlib

Estimado Programmming Communuty,

Estoy intentando realizar un “gráfico interactivo” basado en Tkinter y pylab.plot para representar los valores 1D. La abssisa es una matriz numpy 1D x y los valores ordenados están en una matriz Y multidimensional, por ejemplo.

 import numpy x = numpy.arange(0.0,3.0,0.01) y = numpy.sin(2*numpy.pi*x) Y = numpy.vstack((y,y/2)) 

Quiero mostrar y o y / 2 (los elementos de la matriz Y) de acuerdo con x y cambiar entre ellos con 2 botones a la izquierda y a la derecha (para ir a casos más complejos). Usualmente creo algunas funciones como las siguientes para trazar gráficos.

 import pylab def graphic_plot(n): fig = pylab.figure(figsize=(8,5)) pylab.plot(x,Y[n,:],'x',markersize=2) pylab.show() 

Para agregar dos botones para cambiar el valor del parámetro n , lo he intentado sin éxito:

 import Tkinter from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg class App: def __init__(self,master): # Create a container frame = Tkinter.Frame(master) frame.pack() # Create 2 buttons self.button_left = Tkinter.Button(frame,text="",command=self.increase) self.button_right.pack(side="left") self.canvas = FigureCanvasTkAgg(fig,master=self) self.canvas.show() def decrease(self): print "Decrease" def increase(self): print "Increase" root = Tkinter.Tk() app = App(root) root.mainloop() 

¿Puede alguien ayudarme a entender cómo realizar este tipo de funciones? Muchas gracias.

Related of "Parcela interactiva basada en Tkinter y matplotlib"

Para cambiar los valores de y de la línea, guarde el objeto que se devuelve cuando lo traza ( line, = ax.plot(...) ) y luego use line.set_ydata(...) . Para volver a dibujar la ttwig, utilice canvas.draw() .

Como un ejemplo más completo basado en su código:

 import Tkinter from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure class App: def __init__(self, master): # Create a container frame = Tkinter.Frame(master) # Create 2 buttons self.button_left = Tkinter.Button(frame,text="< Decrease Slope", command=self.decrease) self.button_left.pack(side="left") self.button_right = Tkinter.Button(frame,text="Increase Slope >", command=self.increase) self.button_right.pack(side="left") fig = Figure() ax = fig.add_subplot(111) self.line, = ax.plot(range(10)) self.canvas = FigureCanvasTkAgg(fig,master=master) self.canvas.show() self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1) frame.pack() def decrease(self): x, y = self.line.get_data() self.line.set_ydata(y - 0.2 * x) self.canvas.draw() def increase(self): x, y = self.line.get_data() self.line.set_ydata(y + 0.2 * x) self.canvas.draw() root = Tkinter.Tk() app = App(root) root.mainloop()