[wxpython] Verwendung der Basis- und Zeitachse von wx.lib.plot

Einführung

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.

Umgebung

mac OS python 3.8.5 wxpython 4.1.0

importieren

python


import wx
import wx.lib
import wx.lib.plot as plot

Basic

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 WxLibPlot1.png

Layout

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. WxLibPlot2.gif

Echtzeitzeichnung

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. WxLibPlot3.gif

Die Zeichenmethode ändert sich durch Ändern des Attributs xSpec

python


 self.plotter.xSpec = 'auto' # or 'min', int, (min, max), 'none'

WxLibPlot4.gif

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.

Zeitachsenanzeige

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 WxLibPlot5.gif

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 ..

  1. tick = (0, '0.0')
  2. t = 0
  3. Erstellen Sie ein Datum, das t Sekunden von der Startzeit entfernt ist, und wandeln Sie es in str (= 00:00) um.
  4. Hängen Sie (0, '00: 00 ') an new_ticks an Die folgende Schleife

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

Schließlich

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.

Referenzseite

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

[wxpython] Verwendung der Basis- und Zeitachse von wx.lib.plot
Verwendung des Jupyter-Notebooks [super basic]
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
So verwenden Sie MkDocs zum ersten Mal
Wie benutzt man Seaboan?
Verwendung von Image-Match
Wie man Shogun benutzt
So implementieren Sie die Time-Wait-Verarbeitung mit wxpython
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Verwendung von SymPy
Wie man x-means benutzt
Verwendung von WikiExtractor.py
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Verwendung von return
Wie man Imutils benutzt
Anfänger! Grundlegende Linux-Befehle und Verwendung!
Verwendung von Qt Designer
Verwendung der Suche sortiert
python3: Verwendung der Flasche (2)
Verstehen Sie, wie man Django-Filter verwendet
Verwendung des Generators
Verwendung von FastAPI ③ OpenAPI
Wie benutzt man Python Argparse?
Verwendung von IPython Notebook
Wie man Pandas Rolling benutzt
[Hinweis] Verwendung von virtualenv
Verwendung von Redispy-Wörterbüchern
[Python] Verwendung von checkio
[Go] Verwendung von "... (3 Perioden)"
[Python] Verwendung von input ()
Wie benutzt man den Dekorateur?
[Einführung] Verwendung von open3d
Wie benutzt man Python Lambda?
So verwenden Sie Jupyter Notebook
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
So erhöhen Sie die Achse
So verwenden Sie Google Colaboratory
Verwendung von Python-Bytes
Verwendung der Zip-Funktion