2017-02-16 3 views
1

Ich habe eine GUI mit Python pyqt entwickelt. Dort habe ich eine Matplotlib-Figur mit x, y-Data und vlines, die sich dynamisch mit einem QSlider ändern muss.ändern matplotlib daten in gui

Gerade jetzt ändere ich die Daten nur mit wieder alles und Grundstück zu löschen, aber das ist nicht wirksam

Dies ist, wie ich es tun:

def update_verticalLines(self, Data, xData, valueSlider1, valueSlider2, PlotNr, width_wg): 
    if PlotNr == 2: 
     self.axes.cla() 
     self.axes.plot(xData, Data, color='b', linewidth=2)    
     self.axes.vlines(valueSlider1,min(Data),max(Data),color='r',linewidth=1.5, zorder = 4) 
     self.axes.vlines(valueSlider2,min(Data),max(Data),color='r',linewidth=1.5, zorder = 4) 
     self.axes.text(1,0.8*max(Data),str(np.round(width_wg,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5)) 
     self.axes.text(1,0.6*max(Data),"Pos1: "+str(round(valueSlider1,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5)) 
     self.axes.text(1,0.4*max(Data),"Pos2: "+str(round(valueSlider2,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5)) 
     self.axes.grid(True) 
     self.draw() 

„vlines“ sind LineCollections in matplotlib. Ich habe in der Dokumentation gesucht, konnte aber keinen Hinweis auf eine Funktion wie 'set_xdata' finden. Wie kann ich den x-Wert von vertikalen Linien ändern, wenn diese bereits gezeichnet und in FigureCanvas eingebettet sind?

Ich habe das gleiche Problem mit der X-und Y-Daten zu ändern. Wenn ich die bekannten Funktionen von Matplotlib wie 'set_data' ausprobiere, bekomme ich einen Fehler, dass AxisSubPlot dieses Attribut nicht hat.

Im folgenden ist mein Code für die FigureCanvas-Klasse. Das def update_verticalLines sollte nur Befehle enthalten, um die x-Koordinate der v-Linien zu ändern und die Neuzeichnung nicht abzuschließen.


Edit: Lösung

Dank @Craigular Joe Das war nicht genau, wie es für mich gearbeitet. Ich musste etwas ändern:

def update_verticalLines(self, Data, xData, valueSlider1, valueSlider2, PlotNr, width_wg): 

    self.vLine1.remove() 
    self.vLine1 = self.axes.vlines(valueSlider1,min(Data), max(Data), color='g', linewidth=1.5, zorder = 4) 
    self.vLine2.remove() 
    self.vLine2 = self.axes.vlines(valueSlider2,min(Data), max(Data), color='g', linewidth=1.5, zorder = 4)    
    self.axes.draw_artist(self.vLine1) 
    self.axes.draw_artist(self.vLine2) 
    #self.update() 
    #self.flush_events()   
    self.draw() 

update() funktionierte nicht ohne zeichnen(). (Die alten vlines blieben) flush_events() hat einige verrückte Sachen gemacht. Ich habe zwei Instanzen von FigureCanvas. flush_events() führte dazu, dass innerhalb der zweiten Instanz die vlines mit dem Slider bewegt wurden, dann aber zurück zur Startposition bewegt wurden.

Antwort

0

Wenn Sie die vlines erstellen, speichern Sie eine Referenz darauf, z.

self.my_vlines = self.axes.vlines(...) 

so dass, wenn Sie sie ändern möchten, Sie nur entfernen und ersetzen sie, z.

self.my_vlines.remove() 
self.my_vlines = self.axes.vlines(...) 

# Redraw vline 
self.axes.draw_artist(self.my_vlines) 
# Add newly-rendered lines to drawing backend 
self.update() 
# Flush GUI events for figure 
self.flush_events() 

By the way, in Zukunft sollten Sie Ihr Bestes versuchen, Ihren Code Probe abspecken nur die wesentlichen Teile. Wenn Sie viel unnötigen Beispielcode haben, ist es schwierig, Ihre Frage zu verstehen. :)

+0

Danke! Meine vlines bewegen sich jetzt schnell mit dem Schieberegler. Aber ich konnte flush_events() nicht verwenden. Die vlines der 2. Instanz haben damit nicht funktioniert. – Saorsa