2015-11-09 12 views
6

Ich arbeite gerade an einer Python-Anwendung, die ich angefangen habe, von Grund auf zu schreiben. Was ist bereits vorhanden ist:Python-Matplotlib Live-Grafik ohne Graph-Bewegung (Scrollen)

  1. Ein Thema im Hintergrund laufen sammelt Daten von einem Server und schreibt in eine Datei.
  2. Im Hauptthread i geöffnet haben eine matplotlib Graph GUI auf, die aus dieser Datei Live-Daten-Plots, die ich in Nummer 1 genannten

So sind Dinge, superfein und arbeitet als je, was ich oben erklärt haben. Aber wenn matplotlib die Live-Daten plotten, bewegt sich der Graph dynamisch, wenn die neuen Punkte zur Backend-Datei hinzugefügt werden, auf die er sich bezieht. Ich bin mir nicht sicher, ob ich mein Problem hier gut ausgedrückt habe. Was ich sagen will, ist, wenn der Live-Graph aktualisiert wird, bewegt sich der Graph-Bildschirm buchstäblich vorwärts (von links nach rechts) und der alte Graph (alte Punkte) wird unsichtbar (wenn sich der Bildschirm bewegt) und verloren. Wenn ich versuche, nach links zu scrollen (mit dem Scroll-Werkzeug des Standardwerkzeugs matplotlib), dann gibt es nur Leerzeichen. Was ich will ist:

  1. Der Bildschirm sollte nicht bewegen.
  2. Die alten Punkte sollten sichtbar sein, ohne nach links zu scrollen.
  3. Es sollten nur neue Punkte hinzugefügt werden und die alten Punkte sollten nicht gelöscht oder verschoben werden (verdeckt).

Hier ist mein Code:

#import modules 
import Tkinter as tk 


import MasterWindow 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from threading import Thread 
from datetime import * 
import matplotlib.dates as dates 


from fabfile import connect 
import time 
from fabric.api import env 

LARGE_FONT= ("Verdana", 12) 

env.host_string = '[email protected]' 
env.password = "nms" 

class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent)  
     label = tk.Label(self, text="Graphy-Home", font=LARGE_FONT)  
     label.pack(pady=10,padx=10)  
     Command = tk.Label(self, text="Enter Command")  
     pickCommand = tk.Entry(self)   
     pickCommand.pack(pady=10)   
     Command.pack() 
     button1 = tk.Button(self, text="Submit Command", command=lambda: submit())  
     button1.pack() 

     fig = plt.figure() 
     ax1 = fig.add_subplot(1,1,1) 
     def submit():  
      t1=Thread(target=FileWriter) 
      t1.start() 
      ani = animation.FuncAnimation(fig, animate, interval=1000) 
      plt.show() 
      print("done") 

     def FileWriter(): 
      f=open('F:\\home\\WorkSpace\\FIrstPyProject\\TestModules\\sampleText.txt','w',0) 
      k=0 
      cmd=pickCommand.get() 
      while (k < 40): 
       print("inside while") 
       p=connect(cmd) 
       f.write(p.stdout) 
       f.write('\n') 
       print("wrote data") 
       k += 1 

     def animate(i): 
      print("inside animate") 
      pullData = open("sampleText.txt","r").read() 
      dataArray = pullData.split('\n') 
      xar = [] 
      yar = [] 
      for eachLine in dataArray: 
       if len(eachLine)>1: 
        x,y = eachLine.split(',') 
        timeX=datetime.strptime(x, "%H:%M:%S") 
        xar.append(timeX.strftime("%H:%M:%S")) 
        yar.append(float(y)) 


      #ax1.plot(timeStamps,yar) 
      plt.plot_date(dates.datestr2num(xar), yar,'b-') 

class PageOne(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     label = tk.Label(self, text="Page One!!!", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 

     button1 = tk.Button(self, text="Back to Home", 
          command=lambda: controller.show_frame(StartPage)) 
     button1.pack() 

     button2 = tk.Button(self, text="Page Two", 
          command=lambda: controller.show_frame(PageTwo)) 
     button2.pack() 


class PageTwo(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     label = tk.Label(self, text="Page Two!!!", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 

     button1 = tk.Button(self, text="Back to Home", 
          command=lambda: controller.show_frame(StartPage)) 
     button1.pack() 

     button2 = tk.Button(self, text="Page One", 
          command=lambda: controller.show_frame(PageOne)) 
     button2.pack() 

app = MasterWindow.MasterWindow(StartPage, PageOne, PageTwo) 
app.mainloop() 

Nur ein Heads aufgeben, ist die belebte Funktion der in Hauptschleife ausgeführt wird und die Filewriter-Funktion wird in einem separaten Thread ausgeführt wird, Daten zu sammeln.

Ich hoffe, dass mein Problem so erklärt wird, dass es verstanden werden kann! Wenn etwas unklar ist, lass es mich wissen.

+0

Zugabe ist es nicht, weil es auto-Waage nach jedem Auftragen Schritt? Wäre nicht 'plt.set_xlim (min, max)' nach 'plt.plot_date()' dein Problem zu beheben? Könnten Sie ein Stück Code bereitstellen, damit wir Ihre Handlung einfach reproduzieren können? – jrjc

+0

Anstatt "while (k <40)" und dann "k" inkrementierend, schreibe einfach 'for k in range (40)'. –

+0

@jeanrjc - Ich habe Ihnen den gesamten Code in meiner Frage –

Antwort

0

Nicht sicher, da ich Ihren Code nicht ausführen kann. Aber ich versuche vorschlagen

ax1.axis([xmin, xmax, ymin, ymax]) 

nach

fig = plt.figure() 
    ax1 = fig.add_subplot(1,1,1) 
+0

hi Qiqi, tut mir leid, dass ich so spät zu dir zurück gekommen bin, aber ich denke, ich werde es hier nicht gut erklären ... kann ich dir das auf Stimme in Skype erklären? wenn Sie bereit sind, pls zu besuchen –

Verwandte Themen