pyqtgraph ticks auf der x Achse wiederhohlen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Zeile42
User
Beiträge: 7
Registriert: Montag 21. März 2022, 10:35

Hallo zusammen,

Hat jemand eine Idee, wie ich pyqtgraph (PyQt5) verwenden könnte, um die x-Achse beim Erstellen eines Diagramms zu wiederholen?
Die x-Achse geht also von 0-3 und dann wieder von 0-3 mit verschiedenen y-Werten (siehe Bsp. x- und zugehöriges y- Array)?

Hier ist ein Minimalbeispiel:

Code: Alles auswählen

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox, QVBoxLayout, QWidget
import pyqtgraph as pg

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # Set window properties
        self.setGeometry(100, 100, 1200, 800)
        self.setWindowTitle("PyQt Example")

        x = [0, 1, 2, 3, 0, 1, 2, 3]
        y = [1, 4, 9, 6, 2, 6, 5, 8]

        self.graphWidget = pg.PlotWidget(self)

        # Setze die Labels für die Achsen
        self.graphWidget.setLabel('left', 'Y-Achse', color='blue')
        self.graphWidget.setLabel('bottom', 'X-Achse', color='green')

        curve1 = self.graphWidget.plot(x, y, pen='b', symbol='o',)

        layout = QVBoxLayout()
        layout.addWidget(self.graphWidget)

        central_widget = QWidget()
        central_widget.setLayout(layout)

        self.setCentralWidget(central_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
Danke

Mfg und schönen Tag
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist eher ungewoehnlich. Warum nicht einfach mehrere Plots nebeneinander? Das geht. Sonst wuerde ich die X-Achsen-Werte einfach durchzaehlen lassen, damit das Layout stimmt, und selbt eine Ableitung von https://pyqtgraph.readthedocs.io/en/lat ... sitem.html programmiern, die dann die X-Achse nach den eigenen Wuenschen anders darstellt.
Zeile42
User
Beiträge: 7
Registriert: Montag 21. März 2022, 10:35

Hallo,

danke für die Antwort.

Naja am Ende geht es um die dartsellung einer FFT über mehrere Zeiten (Messungen)- also eion Balkendiagramm.
Somit bräuchte ich entweder zwei x-Achsen, was anscheinend jedoch nicht geht oder liege ich da falsch?
Oder eben, ich schiebe die Messungen nebeneinander und wiederhohle die Ticks auf meiner x-Achse und setzte zwischen die Messungen eine Linie.

Oder hast du eine andere Idee?

Danke

Mfg
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie gesagt, mehrere Plots nebeneinander geht doch problemlos. Jeder für sich hat eine x-Achse, die dann die frequency bins repräsentiert.
Zeile42
User
Beiträge: 7
Registriert: Montag 21. März 2022, 10:35

Ja mehrere Plots nebeneinander ist kein problem, das stimnmt.
Leider bekomme ich das mit der Achsenbeschriftung nicht hin.
Daher auch meine Frage, ob jemand eine Idee hat oder mir helfen könnte.

Falls du so nett wärst, wäre ich dir sehr dankbar.

Mfg
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe nicht, was du meinst. Pro Messung kannst du doch einfach einen Plot machen. Und die nebeneinander anordnen. Was muss da an der Beschriftung gefummelt werden?
Zeile42
User
Beiträge: 7
Registriert: Montag 21. März 2022, 10:35

Ok, jetzt hab ich zuerst nicht verstanden was du meinst.
Das geht leider nicht, ich muss die Messungen in einem Plot darstellen.
Sicher bei mehreren Plots wäre es einfach.

Wie gesagt, die Ticks wären ja immer die selben.
Gibt es da keine Möglichkeit diese einfach periodisch zu wiederholen?
Leider habe ich bis jetzt nicht wirklich etwas gefunden... :(

mfg
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe auch keine gefunden, ich halte das auch für eine sehr fragwürdige Anforderung. Wenn man mehrere in der gleichen Domäne liegende Daten darstellen will, kann man wahlweise verschiedene Plots in einen machen (und zb halb-transparent machen, und/oder via Legende an/aus schalten), oder man plottet die eben einfach in eigene Plots nebeneinander. Eine künstliche X-Achse mit sich wiederholenden Werten ist mir nie untergekommen. Weil das auch eine Unmenge Fragen aufwirft, wie man diese Abschnitte eigentlich schlüssig definieren soll, wie man mit den Rändern bzw Zwischenräumen umgeht, was passiert beim Zoomen, etc pp.

Wenn’s wild sein darf, kannst du auch in die dritte Dimension gehen, und dadurch X und Y Achse für alle FFTs beibehalten.

Wenn es unbedingt sein muss, dann habe ich dir oben meinen Ansatz dargelegt. Das ist auch für mich signifikant viel Arbeit, da wirst du also wahrscheinlich deutlich länger brauchen. Aber ausprobiert habe ich es nicht, ich kann nur empfehlen, den Code zu studieren, und zu schauen, ob du da was hinbekommst. Mein erster Ansatz Bestände darin, die Daten normal mit eben zb Wertn 0..15 (4 ffts, 4Bins) oder ggf 0..18 (4 FFTS, 4 bins, Lücke dazwischen) darszustellen. Und die X-Achsen-Klasse abzuleiten und so zu manipulieren, dass sie für die Werte entsprechend Modulo rechnet vor der Darstellung, womit dann der gewünschte Effekt entsteht.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: das Problem entsteht ja, weil du mit deinen Anforderungen gegen die Annahmen des Frameworks arbeitest. Das macht es im Zweifel dann extra schwer. Die Alternative könnte auch einfach ein eigener renderer aufbauen auf QSceneGraph sein. Damit hast du volle Kontrolle (und Verantwortung), aber arbeitest eben auch nicht gegen den Strich. Kommt dabei darauf an, wieviele der anderen pyqtgraph-Eigenschaften du brauchst (und dann nachbauen müsstest).
Zeile42
User
Beiträge: 7
Registriert: Montag 21. März 2022, 10:35

Danke nochmal für deine Antwort.
Ok das finde ich schon etwas seltsam, dass man nicht einfach die Ticks bzw. Achsenbeschriftung ändern kann bei einem BarGraph.
Man plottet ja eh alles in einer Reihenfolge, nur das halt die Ticks sich wiederholen.
Da ist es für mich eher seltsam, dass man in der x-Achse jeden Wert nur 1 mal haben kann und des Programm die y-Werte auf den x-Wert schiebt wenn dieser schon mal vorher da war.

Eine einfache Darstellung der x-Werte bzw. Ticks genau so wie sie im array stehen, hätte ich schon gedacht, dass es einfach möglich ist aber anscheinend nicht..

mfg
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit pyqtgraph zumindest sehe ich es out-of-the-box nicht. Aber wenn man die Doku durchliest, sieht das hier https://pyqtgraph.readthedocs.io/en/lat ... ickStrings vielversprechend aus.

Oder du benutzt halt matplotlib, da scheint das eher zu gehen: https://stackoverflow.com/questions/291 ... -myplotlib, da kann man die Labels überschreiben.
Antworten