2017-02-20 11 views
1

Ich versuche, ein einzelnes Diagramm neu zu zeichnen, wenn der Benutzer auf dem Bildschirm klickt. Derzeit ist das Diagramm beim ersten Klick gezeichnet. Danach werden neue Plots an die Arbeitsfläche angehängt. Was ich tun möchte, ist, den ersten Plot zu "löschen" oder "zu löschen" und neu zu zeichnen oder ihn mit den neuen Daten zu aktualisieren.Aktualisieren Tkinter Matplotlib Abbildung

Dies ist der Teil verantwortlich für diese spezifische Handlung Unentschieden:

class AppGUI(Tk.Frame): 

    def __init__(self, parent): 
     self.parent = parent 
     self.initGUI() 
     self.plot() 


    def initGUI(self): 
     self.vf_frame = Tk.Frame(self.parent, bd=1, relief=Tk.SUNKEN) 
     self.vf_frame.pack(side=Tk.TOP, fill="both", expand=True) 

    def plotVF(self, u, v): 
      # Canvas of VF 
      m = np.sqrt(np.power(u, 2) + np.power(v, 2)) 

      xrange = np.linspace(0, u.shape[1], u.shape[1]); 
      yrange = np.linspace(0, u.shape[0], u.shape[0]); 

      x, y = np.meshgrid(xrange, yrange) 
      mag = np.hypot(u, v) 
      scale = 1 
      lw = scale * mag/mag.max() 

      f, ax = plt.subplots() 
      h = ax.streamplot(x, y, u, v, color=mag, linewidth=lw, density=3, arrowsize=1, norm=plt.Normalize(0, 70)) 
      ax.set_xlim(0, u.shape[1]) 
      ax.set_ylim(0, u.shape[0]) 
      ax.set_xticks([]) 
      ax.set_yticks([]) 
      #cbar = f.colorbar(h, cax=ax) 
      #cbar.ax.tick_params(labelsize=5) 

      c = FigureCanvasTkAgg(f, master=self.vf_frame) 
      c.show() 
      c.get_tk_widget().pack(side=Tk.LEFT, fill="both", expand=True) 

Muss ich f und ax Attribute meiner Klasse zu tun haben, um dieses Ergebnis zu erreichen? Um es klar zu machen, wird plotVF durch andere Methoden aktualisiert.

PS: Ich kann den Farbbalken auch nicht mit den kommentierten Zeilen anzeigen. Es sagt 'Streamplot' object has no attribute 'autoscale_None'.

Antwort

0

Sie benötigen zwei verschiedene Funktionen, eine zum Starten der Handlung, die andere zum Aktualisieren.

def initplot(self): 
    f, self.ax = plt.subplots() 
    c = FigureCanvasTkAgg(f, master=self.vf_frame) 
    c.show() 
    c.get_tk_widget().pack(side=Tk.LEFT, fill="both", expand=True) 

def update(self, u, v): 
    self.ax.clear() # clear the previous plot 
    ... 
    h = self.ax.streamplot(...) 
    self.ax.set_xlim(0, u.shape[1]) 
    ... 
Verwandte Themen