Dies ist der erste Beitrag! Ich freue mich darauf, mit Dir zu arbeiten!
Es besteht die Möglichkeit, ein Diagramm in Echtzeit in der GUI zu zeichnen, und es handelt sich zu diesem Zeitpunkt um eine Zusammenfassung. Da die GUI wxpython verwendete, habe ich wx.lib.plot im selben wx-Modul verwendet. Es fiel mir schwer, Artikel auf der Zeitachse zu finden, daher hoffe ich, dass Sie sie hilfreich finden.
mac OS python 3.8.5 wxpython 4.1.0
python
import wx
import wx.lib
import wx.lib.plot as plot
Ordnen Sie in der Reihenfolge wx.Frame-> wx.Panel-> plot.Canvas.
python
import wx
import wx.lib
import wx.lib.plot as plot
#Wird zum Zeichnen von Grafiken verwendet
import random
#Wert zu zeichnen
x_val = list(range(10))
y_val = [random.randint(0, 10) for i in range(10)] # 0~10 zufällige Werte bis 10
# [(x1, y1), (x2, y2),...(xn, yn)]Transformiert, um im Format an das Diagramm übergeben zu werden
xy_val = list(zip(x_val, y_val))
class MainFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(500, 500))
#Panel-Erstellung
self.panel = wx.Panel(self, -1)
#Diagrammerstellung
self.plotter = plot.PlotCanvas(self, -1)
#Erstellen Sie eine anzuzeigende Linie&Zeichnung
line = plot.PolyLine(xy_val)
gc = plot.PlotGraphics([line])
self.plotter.Draw(gc)
#Sizer-Erstellung&Installation
sizer = wx.GridSizer(1, 1, gap=(0, 0))
sizer.Add(self.plotter, flag=wx.EXPAND)
self.SetSizer(sizer)
#Zeigen Sie die GUI in der Mitte des Bildschirms an
self.Center()
self.Show()
def main():
app = wx.App()
MainFrame(None, -1, 'WxLibPlot')
app.MainLoop()
if __name__ == '__main__':
main()
Ergebnis
Fügen Sie Diagrammtitel, Legende und Beschriftung hinzu Aktivieren Sie die Zoom- oder Ziehfunktion Ändern Sie Schriftgröße, Linienfarbe und Gewicht
Zoomen und Ziehen können nicht gleichzeitig ausgeführt werden. Wenn Sie also eines aktivieren, wird das andere deaktiviert.
Ändern Sie den Code unter self.plotter = plot.PlotCanvas (self, -1) im obigen Code wie folgt.
python
self.plotter.enableLegend = True #Setzen Sie die Legendenanzeige auf True
self.plotter.fontSizeTitle = 18 #Stellen Sie die Schriftgröße des Diagrammtitels auf 18 ein.(Standard=15)
self.plotter.fontSizeLegend = 18 #Stellen Sie die Legendengröße auf 18 ein.(Standard=7)
self.plotter.fontSizeAxis = 18 #xy label,Stellen Sie die Zeichengröße der Koordinaten auf 18 ein.(Standard=10)
#Aktivieren Sie die Zoom- oder Ziehfunktion. Es kann nur eine aktiviert werden
# self.plotter.enableZoom = True
self.plotter.enableDrag = True
#Erstellen Sie eine anzuzeigende Linie&Zeichnung()
line = plot.PolyLine(xy_val, legend='sample', colour='red', width=4) #Legenden-Text hinzugefügt, Linienfarbe in Rot und Dicke auf 4 geändert
gc = plot.PlotGraphics([line], 'WxLibPlot', 'xaxis', 'yaxis') #Grafiktitel, xy-Beschriftung hinzugefügt
Ergebnis Ziehen ist aktiviert.
Verwenden Sie wx.Timer, um ein Liniendiagramm zu zeichnen, das jede Sekunde zufällige Werte annimmt. Dieses Mal haben wir eine Schaltfläche hinzugefügt, um den Beginn und das Ende des Diagramms zu steuern.
python
import wx
import wx.lib
import wx.lib.plot as plot
#Wird zum Zeichnen von Grafiken verwendet
import random
class MainFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(500, 500))
#Panel-Erstellung
self.panel = wx.Panel(self, -1)
#Taste zum Starten und Stoppen der Messung
self.start_button = wx.Button(self, -1, label='start')
self.stop_button = wx.Button(self, -1, label='stop')
#Diagrammerstellung
self.plotter = plot.PlotCanvas(self, -1)
#Anfangswert des Plotpunktes
self.x_val = 0
self.xy_val = []
self.plotter.enableLegend = True #Setzen Sie die Legendenanzeige auf True
self.plotter.fontSizeTitle = 18 #Stellen Sie die Schriftgröße des Diagrammtitels auf 18 ein.(Standard=15)
self.plotter.fontSizeLegend = 18 #Stellen Sie die Legendengröße auf 18 ein.(Standard=7)
self.plotter.fontSizeAxis = 18 #xy label,Stellen Sie die Zeichengröße der Koordinaten auf 18 ein.(Standard=10)
#Aktivieren Sie die Zoom- oder Ziehfunktion. Es kann nur eine aktiviert werden
# self.plotter.enableZoom = True
# self.plotter.enableDrag = True
#Erstellen Sie eine anzuzeigende Linie&Zeichnung()
line = plot.PolyLine(self.xy_val, legend='sample', colour='red', width=2) #Legenden-Text hinzugefügt, Linienfarbe in Rot und Dicke auf 4 geändert
gc = plot.PlotGraphics([line], 'RealTimePlot', 'xaxis', 'yaxis') #Grafiktitel, xy-Beschriftung hinzugefügt
self.plotter.Draw(gc)
#Erstellen Sie einen Frame-Timer
self.timer = wx.Timer(self)
#Sizer-Erstellung&Installation
sizer1 = wx.FlexGridSizer(2, 1, gap=(0, 0)) #Ein Sizer zum Anordnen eines 2-mal-1-Diagramms und Sizer2
sizer2 = wx.GridSizer(1, 2, gap=(0, 0)) #Sizer zum Anordnen von Schaltflächen in 1 Zeile und 2 Spalten
sizer1.Add(self.plotter, flag=wx.EXPAND) # flag=wx.EXPAND:Erweitern Sie die Breite und Höhe bis zum Maximum
sizer1.Add(sizer2, flag=wx.ALIGN_RIGHT) # flag=wx.ALIGN_RIGHT:Rechts installiert
sizer1.AddGrowableCol(0) #Erweitern Sie die Breite der ersten Reihe bis zum Maximum
sizer1.AddGrowableRow(0) #Erweitern Sie die Höhe der ersten Zeile bis zum Maximum
#Tasteninstallation
sizer2.Add(self.start_button)
sizer2.Add(self.stop_button)
self.SetSizer(sizer1)
#Veranstaltungen
self.start_button.Bind(wx.EVT_BUTTON, self.graph_start)
self.stop_button.Bind(wx.EVT_BUTTON, self.graph_stop)
self.Bind(wx.EVT_TIMER, self.graph_plot)
#Zeigen Sie die GUI in der Mitte des Bildschirms an
self.Center()
self.Show()
def graph_start(self, event):
self.plotter.Clear() #Diagramm initialisieren
self.x_val, self.xy_val = 0, [] # x_val, xy_Val initialisieren
self.timer.Start(1000)
def graph_stop(self, event):
self.timer.Stop()
def graph_plot(self, event):
y_val = random.randint(0, 100)
self.xy_val.append((self.x_val, y_val))
line = plot.PolyLine(self.xy_val, legend='sample', colour='red', width=2)
gc = plot.PlotGraphics([line], 'RealTimePlot', 'xaxis', 'yaxis')
self.plotter.Draw(gc)
self.x_val += 1
def main():
app = wx.App()
MainFrame(None, -1, 'WxLibPlot')
app.MainLoop()
if __name__ == '__main__':
main()
Ergebnis Nach dem Drücken der Starttaste wird es einmal weiß, da das Diagramm initialisiert wird.
Die Zeichenmethode ändert sich durch Ändern des Attributs xSpec
python
self.plotter.xSpec = 'auto' # or 'min', int, (min, max), 'none'
Von oben ist es'auto ',' min ', int, (min, max). 'auto' ist die Standardeinstellung. Wenn Sie einen ganzzahligen Typ zuweisen, ist das Verhalten dasselbe wie 'min', aber die Koordinaten sind fest. Im obigen Beispiel ist das Diagramm in vier Teile unterteilt und die Koordinaten werden an der Grenze angezeigt.
'none' wird weggelassen, da nur die x-Achse und die Beschriftung gelöscht werden.
Dies ist der Teil, den ich am meisten schreiben wollte. Ich werde sofort den Code und das Ergebnis schreiben. Das Zeitintervall beträgt 1 Sekunde.
python
import datetime as dt
import random
import wx
import wx.lib
import wx.lib.plot as plot
class TimeAxisPlot(plot.PlotCanvas):
def __init__(self, parent, id):
plot.PlotCanvas.__init__(self, parent, id)
#Layoutbeziehungen definieren
self.enableLegend = True
self.fontSizeLegend = 18
self.fontSizeAxis = 18
self.xSpec = 4
self.startDate = dt.datetime.now()
self.data = []
line = plot.PolyLine(self.data, legend='sample', colour='red')
gc = plot.PlotGraphics([line], 'TimeAxisPlot', 'time', 'yaxis')
self.Draw(gc)
def _xticks(self, *args):
ticks = plot.PlotCanvas._xticks(self, *args)
# ticks = [(Punkte zeichnen,Zeichen angezeigt werden), (),...()]
new_ticks = []
for tick in ticks:
t = tick[0]
time_value = self.startDate + dt.timedelta(seconds=t)
time_value_str = time_value.strftime('%H:%M:%S')
new_ticks.append([t, time_value_str])
# new_ticks = [(Punkte zeichnen,Tageszeiten), (),...()]
#Ändern Sie die angezeigten Zeichen in Zeit
return new_ticks
class MainFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(500, 500))
#Panel-Erstellung
self.panel = wx.Panel(self, -1)
#Taste zum Starten und Stoppen der Messung
self.start_button = wx.Button(self, -1, label='start')
self.stop_button = wx.Button(self, -1, label='stop')
#Diagrammerstellung
self.plotter = TimeAxisPlot(self, -1)
#Anfangswert des Plotpunktes
self.x_val = 0
self.xy_val = []
self.plotter.enableLegend = True #Setzen Sie die Legendenanzeige auf True
self.plotter.fontSizeTitle = 18 #Stellen Sie die Schriftgröße des Diagrammtitels auf 18 ein.(Standard=15)
self.plotter.fontSizeLegend = 18 #Stellen Sie die Legendengröße auf 18 ein.(Standard=7)
self.plotter.fontSizeAxis = 18 #xy label,Stellen Sie die Zeichengröße der Koordinaten auf 18 ein.(Standard=10)
#Erstellen Sie eine anzuzeigende Linie&Zeichnung()
line = plot.PolyLine(self.xy_val, legend='sample', colour='red', width=2) #Legenden-Text hinzugefügt, Linienfarbe in Rot und Dicke auf 4 geändert
gc = plot.PlotGraphics([line], 'RealTimePlot', 'xaxis', 'yaxis') #Grafiktitel, xy-Beschriftung hinzugefügt
self.plotter.Draw(gc)
#Erstellen Sie einen Frame-Timer
self.timer = wx.Timer(self)
#Sizer-Erstellung&Installation
sizer1 = wx.FlexGridSizer(2, 1, gap=(0, 0)) #Ein Sizer zum Anordnen eines 2-mal-1-Diagramms und Sizer2
sizer2 = wx.GridSizer(1, 2, gap=(0, 0)) #Sizer zum Anordnen von Schaltflächen in 1 Zeile und 2 Spalten
sizer1.Add(self.plotter, flag=wx.EXPAND) # flag=wx.EXPAND:Erweitern Sie die Breite und Höhe bis zum Maximum
sizer1.Add(sizer2, flag=wx.ALIGN_RIGHT) # flag=wx.ALIGN_RIGHT:Rechts installiert
sizer1.AddGrowableCol(0) #Erweitern Sie die Breite der ersten Reihe bis zum Maximum
sizer1.AddGrowableRow(0) #Erweitern Sie die Höhe der ersten Zeile bis zum Maximum
#Tasteninstallation
sizer2.Add(self.start_button)
sizer2.Add(self.stop_button)
self.SetSizer(sizer1)
#Veranstaltungen
self.start_button.Bind(wx.EVT_BUTTON, self.graph_start)
self.stop_button.Bind(wx.EVT_BUTTON, self.graph_stop)
self.Bind(wx.EVT_TIMER, self.graph_plot)
#Zeigen Sie die GUI in der Mitte des Bildschirms an
self.Center()
self.Show()
def graph_start(self, event):
self.plotter.Clear() #Diagramm initialisieren
self.x_val, self.xy_val = 0, [] # x_val, xy_Val initialisieren
self.timer.Start(1000)
def graph_stop(self, event):
self.timer.Stop()
def graph_plot(self, event):
y_val = random.randint(0, 100)
self.xy_val.append((self.x_val, y_val))
line = plot.PolyLine(self.xy_val, legend='sample', colour='red', width=2)
gc = plot.PlotGraphics([line], 'RealTimePlot', 'xaxis', 'yaxis')
self.plotter.Draw(gc)
self.x_val += 1
def main():
app = wx.App()
MainFrame(None, -1, 'TimeAxisPlot')
app.MainLoop()
if __name__ == '__main__':
main()
Ergebnis
Plot.Canvas erben, um eine neue Klasse zu erstellen und die Koordinatenmethode der x-Achse zu überschreiben. Hier,
python
def _xticks(self, *args):
ticks = plot.PlotCanvas._xticks(self, *args)
# ex)ticks = [(0, '0.0'), (0.5, '0.5'), (1.0, '1.0'), (1.5, '1.5'), (2.0, '2.0')]
# [(x-Koordinate(float)), (x-Koordinateに表示する文字(str))...]
Ticks gibt [(x-Koordinate (float)), (Zeichen, das auf der x-Koordinate (str) angezeigt werden soll) ...] zurück. Die Zeitachse wird erstellt, indem die angezeigten Zeichen in Zeit geändert werden.
Methode Erstellen Sie ein Tupel aus Koordinaten und Zeit und hängen Sie es an die leere Liste new_ticks an Beispiel: Startzeit: 0:00, Ticks = [(0, '0,0'), (0,5, '0,5'), (1,0, '1,0'), (1,5, '1,5'), (2,0, '2,0' )]Zeit
für Satz 1 ..
python
new_ticks = []
for tick in ticks: #Schleife mit den erworbenen Zecken
#0. Taple(x Koordinatenpunkte)Erhalten
t = tick[0]
time_value = self.startDate + dt.timedelta(seconds=t)
time_value_str = time_value.strftime('%H:%M:%S')
new_ticks.append([t, time_value_str])
# new_ticks = [(Punkte zeichnen,Tageszeiten), (),...()]
#Ändern Sie die angezeigten Zeichen in Zeit
return new_ticks
Danke fürs Lesen. Wie ich während der Ausführung bemerkte, betrug die schnellste Zeichengeschwindigkeit etwa 0,05 Sekunden. Beachten Sie, dass sich die Ausführungsgeschwindigkeit nicht geändert hat, auch wenn das Timer-Intervall kürzer war.
offiziell wx.lib.plot — wxPython Phoenix 4.1.1a1 documentation
Referenz für Echtzeitzeichnung wxPython: Zeichnung und Grafik gleichzeitig zeichnen
Referenz der Zeitachse [Hinweis] Passen Sie die y-Achsenskala des Diagramms an ─ wxPython wxPython-users - wx.lib.plot custom labels?
Recommended Posts