2016-05-10 10 views
1

Ich versuche mit Python3 eine GUI zu programmieren, die 4 verschiedene Graphen in 4 Layouts darstellt: Geschwindigkeit, Höhe, Koordinaten und der Winkel. Momentan kann ich die Figur in jedem Layout zeichnen. Ich habe jedoch keine Ahnung, wie man verschiedene Funktionen in jeden Graphen einträgt. Ich habe eine Methode verwendet, um zufällig 10 Punkte für die Handlung zu generieren. Wenn die Methode aufgerufen wird, zeichnet sie den gleichen Graph in jede 4 Zeichenfläche.Wie werden in PyQt4 in einem Fenster verschiedene Graphen in verschiedenen Canvas-Bereichen dargestellt?

Also meine Frage ist ** ob es trotzdem eine unterschiedliche Funktion zu einer Figur plotten soll (ein Plot pro Graph)? ** Ich bin python3 ziemlich neu und wäre dankbar für jede Hilfe.

Wenn möglich, möchte ich vermeiden, viele Unterplots in einer Figur zu verwenden, da bereits ein Layout für jede Figur existiert.

Hier ist, was die aktuelle GUI aussieht, wenn ich den Test-Methode aufrufen, die zufällige Punkte generiert, können Sie sehen, dass the same graph are plotted in each canvas

Ich werde auch erwähnen, wenn es keine Einschränkungen hinzufügt, dass dieser Code schließlich sein wird, verwendet, um Diagramme zu plotten, die mit Daten aus einem anderen Thread aktualisiert werden.

Und hier ist der Code:

from PyQt4 import QtGui 
    from .flight_dataUI import Ui_Dialog 
    import matplotlib.pyplot as plt 
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
    from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar 
    import random 

    class FlightData(QtGui.QDialog, Ui_Dialog): 
     def __init__(self, parent=None): 
      QtGui.QDialog.__init__(self, parent) 
      self.setupUi(self) 

      self.figure = plt.figure() # FlightData.figure = matplotlib.pyplot.figure() 
    #  Creates a figure widget self.name = FigureCanvas(self.figure) 
      self.speedGraph = FigureCanvas(self.figure) 
      self.heightGraph = FigureCanvas(self.figure) 
      self.mapGraph = FigureCanvas(self.figure) 
      self.angleGraph = FigureCanvas(self.figure) 
    # ------------------------------------------------------------- 
      self.speedLayout.addWidget(self.speedGraph) # insert widget "speedGraph" in speedLayout 
      self.heightLayout.addWidget(self.heightGraph) # insert widget "heightGraph" in heightLayout 
      self.mapLayout.addWidget(self.mapGraph) # insert widget "mapGraph" in mapLayout 
      self.angleLayout.addWidget(self.angleGraph) # insert widget "angleGraph" in angleLayout 
      self.ax = self.figure.add_subplot(111) 
      self.ax.hold(False) 

      self.init_widgets() 

     def init_widgets(self): 
      self.analyseButton.clicked.connect(self.open_analysedata) 
      self.draw_plot() 

     def open_analysedata(self): 
      self.done(2) # Closes and delete Dialog window et and return the int 2 as a results in main_window.py 

     def draw_plot(self): 
      data = [random.random() for i in range(10)] 
      self.ax.plot(data, '-*') 

Antwort

0

Wenn nicht pyplot Einbettung importiere, wird es globalen Zustand ist nur führen, dass Sie Schwierigkeiten. Sie verwenden dieselbe Figur, um alle 4 FigureCanvas Objekte zu initialisieren. Sie möchten etwas tun wie:

from matplotlib.figure import Figure 

class FlightData(QtGui.QDialog, Ui_Dialog): 
    def __init__(self, parent=None): 
     QtGui.QDialog.__init__(self, parent) 
     self.setupUi(self) 
     self.figs = {} 
     self.canvas = {} 
     self.axs = {} 
     plot_names = ['speed', 'height', 'map', 'angle'] 
     for pn in plot_names: 
      fig = Figure() 
      self.canvas[pn] = FigureCanvas(fig) 
      ax = fig.add_subplot(1, 1, 1) 

      self.figs[pn] = fig 
      self.axs[pn] = ax 

     # ------------------------------------------------------------- 
     self.speedLayout.addWidget(self.canvas['speed']) 
     self.heightLayout.addWidget(self.canvas['height']) 
     self.mapLayout.addWidget(self.canvas['map']) 
     self.angleLayout.addWidget(self.canvas['angle']) 

    def draw_plot(self, target, data): 
     self.axs[target].plot(data, '-*') 
     self.canvas[target].draw_idle() 
+0

Hallo, vielen Dank für Ihre Antwort. Ich verstehe die meisten von Ihnen Code und beschlossen, es zu versuchen. Allerdings bekomme ich diesen Nameerror "NameError: Name 'Figur' ist nicht definiert" – SirIguan

+0

** edit: mein Fehler es scheint, ich habe Figur aus der Klasse matplotlib.figure nicht importiert. Der Code funktioniert jetzt und ich kann einen Plot überall dort einrichten, wo ich will. Vielen Dank! ** – SirIguan

+0

Oh, tut mir leid, das war eine Kopie Paste fehlschlagen – tacaswell

Verwandte Themen