Achsenwerte nach Zoomen/Ziehen mit Standard pyplot Toolbar

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
robert12
User
Beiträge: 2
Registriert: Dienstag 16. April 2019, 10:30

Hallo zusammen,

ich versuche gerade ein Programm zu entwickeln, in dem der Nutzer Daten in einem (erstmal wohl Standard Pyplot-)Diagramm betrachten und einen Teilbereich auswählen kann. Nach dem Auswählen eines neuen Bereichs sollen nur die jeweils angezeigten Daten in dem Teilbereich zur weiteren Datenverarbeitung (z.B. Fitten) verwendet werden.
Dafür versuche ich zunächst die immer aktuellen Achsenbereiche auszulesen. Zuerst habe ich pyqt5 als GUI verwendet, möchte jetzt allerdings demnächst auf tkinter umsteigen, weil es mir leichter erscheint. Aber ich bekomme das "ständige neue Auslesen" des Achsenbereiches gerade nicht hin: Gerade versuche ich eine entsprechende Schleife einzubauen, die für das regelmässige Abrufen sorgt, was aber logischerweise immer ein "Steckenbleiben" in der Schleife verursacht und der Nutzer nicht gleichzeitig zoomen kann. Kann mir der interaktive Pyplot Modus hierbei irgendwie helfen? Was gäbe es sonst für Lösungsansätze?

Falls jemand meine (zugegebenerweise nicht wirklich sinnvolle) for-Schleifen Idee ausprobieren möchte, habe ich den Code dafür in Pyqt 5 mal angehangen.

Bin für jeden Ratschlag dankbar!

Robert


Dafür habe ich (hier vereinfacht) folgenden Code verwendet, die Vorschleife ist am ende der letzten definierten Klasse für das Hauptfenster

import PyQt5.QtCore as QC
import PyQt5.QtGui as QG
import PyQt5.QtWidgets as QW
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4 import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
import math
import numpy as np
from random import randint
import time

xdaten = np.zeros(100)
ydaten = np.zeros(100)

for i in np.arange(100):
xdaten = randint(0, 100)
ydaten = randint(0, 100)

class CentralWidget(QW.QWidget): #das Daten
def __init__(self, parent=None):
super(CentralWidget, self).__init__(parent)
vbox = QW.QVBoxLayout(self)


self.figure = plt.figure()
plt.ion() #das hatte ich zuerst ausprobiert, ändert aber nichts merkbares
self.ax = self.figure.add_subplot(111)
self.canvas = FigureCanvas(self.figure)
self.canvas.setParent(parent)

self.toolbar = NavigationToolbar(self.canvas, self)
self.plotButton = QW.QPushButton("Plot")


ylimits = self.ax.get_ylim()

vbox.addWidget(self.toolbar)
vbox.addWidget(self.canvas)
vbox.addWidget(self.plotButton)

self.ausgabe = QW.QLabel(str(ylimits))
vbox.addWidget(self.ausgabe)

self.setLayout(vbox)
self.setStyleSheet("background-color: lightblue")

def readOutLimits(self):
self.ausgabe.setText(str(self.ax.get_ylim()))

class FittingPart(QW.QWidget): #Fuer dieses Bsp nicht relevant
def __init__(self, parent=None):
super(FittingPart, self).__init__(parent)

Rvbox = QW.QVBoxLayout()

self.ausgabe = QW.QLabel("die aktuellen ylimits sind ")

Rvbox.addWidget(self.ausgabe)


self.setLayout(Rvbox)


class MainWindow(QW.QMainWindow):

def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("Main Window Framework")

self.setGeometry(100, 100, 1600, 900)
self.CenW = CentralWidget()
self.LeftDock = FittingPart()

## Left
self.left_dock = QW.QDockWidget("Left Dock Widget", self)
self.left_dock.setWidget(self.LeftDock)
self.addDockWidget(QC.Qt.LeftDockWidgetArea, self.left_dock)


self.setCentralWidget(self.CenW)
self.CenW.plotButton.clicked.connect(self.PlotData)

def PlotData(self):
self.CenW.ax.scatter(xdaten, ydaten)
for i in np.arange(1000): #IN DIESER FOR SCHLEIFE BLEIBT DER CODE DANN LOGISCHERWEISE STECKEN
time.sleep(1)
self.CenW.readOutLimits()
print(i)

def main():
app = QW.QApplication(sys.argv)
mainwindow = MainWindow()
mainwindow.show()
sys.exit(app.exec_())


if __name__ == "__main__":
main()
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das mischen von Qt5 und Qt4 sieht sehr ungewöhnlich aus. Kann mir schwer vorstellen das klappt.

Und wenn man wiederkehrende Aufgaben in GUIs machen will, muss man mit Timern arbeiten. QTimer in Qt.

Gleiches gilt für das vermeintlich einfachere tkinter.
robert12
User
Beiträge: 2
Registriert: Dienstag 16. April 2019, 10:30

__deets__ hat geschrieben: Dienstag 16. April 2019, 21:31 Das mischen von Qt5 und Qt4 sieht sehr ungewöhnlich aus. Kann mir schwer vorstellen das klappt.

Und wenn man wiederkehrende Aufgaben in GUIs machen will, muss man mit Timern arbeiten. QTimer in Qt.

Gleiches gilt für das vermeintlich einfachere tkinter.
wo sind die Anteile von Qt4? Die habe ich nicht bewusst eingebaut und würde ich gerne eliminieren, danke fürs darauf aufmerksam machen!

ich habe es jetzt im Moment ohne tatsächliche Gleichzeitigkeit gelöst, sonder so, dass man über ein Button das Neuladen des Achsenbereiches anfordern muss, werde aber mal weiter mit den QTimern gucken, danke für den Hinweis.
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@robert12: Such doch in Deinem Quelltext einfach mal nach „qt4“, dann wirst Du sehen, dass Du die Qt4-Backends von `matplotlib` importierst – und die verwendest Du dann mit Qt5.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten