2016-03-23 8 views
2

Hier ist der Code, den ich so weit bin mit:Wie kann ich löschen Zeilen selektiv auf einer 2 y-Achse subplot matplotlib mit (Python)

class Main: 
    app = QtGui.QApplication(sys.argv) 

    QtCore.QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()")) 
    mainWidget = Gui.PointPredictorGui() 
    app.setActiveWindow(mainWidget) 
    mainWidget.show() 
    app.exec() 

class PointPredictorGui(QtGui.QMainWindow): 
def __init__(self, parent = None): 
    QtGui.QMainWindow.__init__(self) 
    frame = QtGui.QFrame() 
    hobo = QtGui.QHBoxLayout() 
    self.graphFigure = plt.Figure() 
    self.graphCanvas = FigureCanvas(self.graphFigure) 

    self.ax1 = self.graphFigure.add_subplot(111) 
    self.ax2 = self.ax1.twinx() 

    self.check1 = QtGui.QCheckBox("1") 
    self.check2 = QtGui.QCheckBox("2") 

    hobo.addWidget(self.graphCanvas) 
    hobo.addWidget(self.check1) 
    hobo.addWidget(self.check2) 

    frame.setLayout(hobo) 
    self.setCentralWidget(frame) 
    self.check1.stateChanged.connect(self.updateGraph) 
    self.check2.stateChanged.connect(self.updateGraph) 

def updateGraph(self): 

    if self.check1.isChecked(): self.ax1.plot([1,2,3,4,5], [1,2,3,4,5], '--') 
    elif not self.check1.isChecked(): self.eraseMethod() 
    if self.check2.isChecked(): self.ax2.plot([1,2,3,4,5], [500,400,300,200,100], '--') 
    elif not self.check2.isChecked(): self.eraseMethod() 
    self.graphCanvas.draw() 

def eraseMethod(self): 
    self.graphFigure.clear() 

Was zu passieren zu bekommen Ich versuche, ist, dass Ich möchte, dass die Linie den Achsen 1 oder 2 zugeordnet wird, abhängig davon, ob das entsprechende Kontrollkästchen aktiviert ist oder nicht.

Wenn beide werden geprüft:

enter image description here

Wenn nur der zweite wird geprüft:

enter image description here

Sie bekommen die Idee.

Das Problem, das ich habe, ist, dass ich nicht scheinen kann, entweder dies den richtigen Weg zu implementieren, was ich tun möchte, oder herauszufinden, welche Methode aus welcher Klasse zu verwenden. So ziemlich alles, was ich probiert habe, führt dazu, dass sich überhaupt keine Veränderung vollzieht oder dass der Graph-Teil ganz verschwindet.

Zur Erinnerung, das ist, was ich tun möchte: Linien erscheinen, wenn Kontrollkästchen (fertig) Linien verschwinden, wenn Kontrollkästchen deaktiviert bekommen (nicht fertig)

Auch jedes Mal, ist in Ordnung, die ganze Sache neu gezeichnet erhalten überprüft Wenn ich darauf zurückgreifen muss.

+0

Halten Sie die 'Line2D' Objekte, die von' plot' zurückgegeben werden, und verwenden Sie entweder die 'remove' Methode oder die' set_visible' Methode. Ich schlage vor, 'draw_idle' anstatt' draw' zu verwenden. – tacaswell

+0

Wenn ich das tue: self.line1 = self.ax1.plot ([1,2,3,4,5], [1,2,3,4,5], '-') . self.line1.set_visible (T/F) existiert nicht und das Entfernen benötigt einen unbekannten Parameter. Ich habe festgestellt, dass beide Methoden Teil der Artist-Klasse sind, von der Line2D erbt. Wenn das der Fall ist, warum kann ich die Methoden in der Artist-Klasse nicht verwenden? – Korbaine

Antwort

0

Ich fand es heraus.

self.graphFigure = plt.figure() 

fig, self.ax1 = plt.subplots() 
self.ax2 = self.ax1.twinx() 

self.graphCanvas = FigureCanvas(fig) 

Dies ist das Setup der Graph-Widget haben, um muss zu machen, was ich möglich zu tun versuchte. Warum? Ich bin mir nicht ganz sicher, vielleicht könnte jemand anderes das beantworten. Was ich jedoch weiß, ist, dass das Neuzeichnen des Graphen auf einer Achse-für-Achse-Basis erforderlich ist. Hier ist meine Update-Methode:

def updateGraph(self): 
    plt.sca(self.ax2) 
    plt.cla() 
    plt.sca(self.ax1) 
    plt.cla() 
    if self.check1.isChecked(): 
     self.ax1.plot([1,2,3,4,5], [1,2,3,4,5], '--') 

    if self.check2.isChecked(): 
     self.ax2.plot(self.line2.get_xdata(), self.line2.get_ydata(), '--') 

    self.graphCanvas.draw_idle() 

By the way, hier ist was self.line2 ist: self.line1 = matplotlib.lines.Line2D([1,2,3,4,5], [1,2,3,4,5])

ich beide Wege versucht (die Liste und die Linienobjekt), um zu sehen, ob irgendwelche seltsame Fehler kam. Zurück zum Neuzeichnen des Graphen, musste ich eine der Achsen löschen (plt.cla()), dann plot-to-it (self.axis.plot (stuffx, sticky)), dann zeichne die Grafik neu. Um sicherzustellen, dass bei jedem Aufruf der Update-Methode beide Achsen aktualisiert wurden, musste ich zwischen den Achsen wechseln (plt.sca (zu löschende Achse)) und den Vorgang wiederholen, danach neu zeichnen.

Ich hoffe, das hilft jedem anderen, der auf dieses Problem stieß.

Verwandte Themen