Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PyQt + Matplotlib
#1
Hi,
I have window with buttons and some text and I need insert matplotlib below buttons.

Here is my code:

import sys
from PyQt6.QtCore import QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QCheckBox, QWidget, QLabel
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt


class AnotherWindow(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        self.setWindowTitle("MFR - Options")
        self.setMinimumSize(QSize(800, 400))
        self.setLayout(layout)

class MainWindow(QMainWindow):
 
    def button_TS_clicked(self):
        print("Time signal button clicked!")

    def button_FFT1500_clicked(self):
        print("FFT1500 button clicked!")

    def button_FFT7500_clicked(self):
        print("FFT7500 button clicked!")
    
    def button_hilbert_clicked(self):
        print("Hilbert button clicked!")

    def button_save_clicked(self):
        print("Save button clicked!")    

    def button_options_clicked(self):
        self.dialog.exec_()

    def cb_update(self, state):
        if state == Qt.CheckState.Checked.value:
            print("AutoUpdate ON")
        else:
            print("AutoUpdate OFF")

    def options_window(self, checked):
        if self.window1.isVisible():
            self.window1.hide()
        else:
            self.window1.show()
     
    def __init__(self):
                
        super().__init__()
        self.window1 = AnotherWindow()
        self.setWindowTitle("MFR")
        self.setMinimumSize(QSize(1024, 600))
        
        button_TS = QPushButton("Time signal", self)
        button_TS.move(30,30)
        button_TS.clicked.connect(self.button_TS_clicked)

        button_FFT1500 = QPushButton("FFT 10-1500Hz", self)
        button_FFT1500.move(150,30)
        button_FFT1500.clicked.connect(self.button_FFT1500_clicked)

        button_FFT7500 = QPushButton("FFT 500-7500Hz", self)
        button_FFT7500.move(270,30)
        button_FFT7500.clicked.connect(self.button_FFT7500_clicked)

        button_hilbert = QPushButton("Hilbert", self)
        button_hilbert.move(390,30)
        button_hilbert.clicked.connect(self.button_hilbert_clicked)

        button_save = QPushButton("Save wav", self)
        button_save.move(510,30)
        button_save.clicked.connect(self.button_save_clicked)

        button_options = QPushButton("Options", self)
        button_options.move(630,30)
        button_options.clicked.connect(self.options_window)
         
        cb = QCheckBox("Auto Update", self)
        cb.move(750,30)
        cb.stateChanged.connect(self.cb_update)
        cb.toggle()
        cb.setChecked(False)

        self.label_1 = QLabel(self)
        self.label_1.move(30, 70)
        self.label_1.setText("SOME TEXTS.........................")
        
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
I need it like this:
https://pasteboard.co/2IfAA0WyUAxX.jpg

I tried combine with this code, but I am totally lost. Thank you for help.
Reply
#2
An Example for PQt5

import sys
import matplotlib
matplotlib.use("Qt5Agg")
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


class MyMplCanvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)

        self.compute_initial_figure()
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                                   QSizePolicy.Expanding,
                                   QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        pass

class MyStaticMplCanvas(MyMplCanvas):
    def compute_initial_figure(self):
        t = arange(0.0, 3.0, 0.01)
        s = sin(2*pi*t)
        self.axes.plot(t, s)


class ApplicationWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setWindowTitle("Window")
        sc = MyStaticMplCanvas(self, width=5, height=4, dpi=100)
        self.setCentralWidget(sc)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    aw = ApplicationWindow()
    aw.setWindowTitle("PyQt5 Matplot Example")
    aw.show()
    app.exec()
Reply
#3
or use the builtin chart in PyQt6

from PyQt6.QtWidgets import QApplication, QMainWindow
import sys
from PyQt6.QtCharts import QChart, QChartView, QLineSeries
from PyQt6.QtCore import QPointF
from PyQt6.QtGui import QPainter
from PyQt6.QtCore import Qt
 
 
class Window(QMainWindow):
    def __init__(self):
        super().__init__()
 
        self.setWindowTitle("PyQtChart Line")
        self.setGeometry(100,100, 680,500)
        self.show()
        self.create_linechart()

    def create_linechart(self): 
        series = QLineSeries(self)
        series << QPointF( 1, 91.9) << QPointF( 2, 89.5) << QPointF( 3, 84.6) << QPointF( 4, 92.0) << QPointF( 5, 87.6) << QPointF( 6, 89.4) << QPointF( 7, 83.9) << QPointF( 8, 90.1) << QPointF( 9, 89.7) << QPointF( 10, 89.6) << QPointF( 11, 86.1) << QPointF( 12, 85.3) << QPointF( 13, 91.3) << QPointF( 14, 89.0) << QPointF( 15, 85.3) << QPointF( 16, 91.6) << QPointF( 17, 91.1) << QPointF( 18, 91.3) << QPointF( 19, 88.3) << QPointF( 20, 84.1) << QPointF( 21, 88.9) << QPointF( 22, 91.1) << QPointF( 23, 86.6) << QPointF( 24, 88.2) << QPointF( 25, 90.3) << QPointF( 26, 89.3) << QPointF( 27, 85.0) << QPointF( 28, 88.6) << QPointF( 29, 86.0) << QPointF( 30, 87.1) << QPointF( 31, 84.3)
 
        chart =  QChart()
 
        chart.addSeries(series)
        chart.createDefaultAxes()
        chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
        chart.setTitle("Line Chart Example")
 
        chart.legend().setVisible(True)
        chart.legend().setAlignment(Qt.AlignmentFlag.AlignBottom)
 
        chartview = QChartView(chart)
        chartview.setRenderHint(QPainter.RenderHint.Antialiasing)
 
        self.setCentralWidget(chartview)

 
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
Reply
#4
Thank you for the code, seems great.

And is any possibility to use Matplotlib (because FFT) in PyQt6 like my code? Because I like Qt6 design but I have no clue hot to insert the Plot and make space for buttons on the top.
Thank for your help!
Reply
#5
https://www.pythonguis.com/tutorials/plo...fceb18628b
Reply
#6
I don't think matplotlib works properly with PyQt6 yet.
Reply
#7
(Mar-30-2022, 06:57 PM)Axel_Erfurt Wrote: I don't think matplotlib works properly with PyQt6 yet.

Yes, I see. I will use PyQt5. And how to move plot for example 100pixels down?
Thanks
Reply
#8
You can add an empty widget with fixed height

import sys
import matplotlib
matplotlib.use("Qt5Agg")
from PyQt5 import QtCore
from PyQt5.QtWidgets import (QApplication, QMainWindow, QSizePolicy, QLabel, 
                                QVBoxLayout, QHBoxLayout, QWidget, QPushButton)
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
 
 
class MyMplCanvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
 
        self.compute_initial_figure()
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
 
        FigureCanvas.setSizePolicy(self,
                                   QSizePolicy.Expanding,
                                   QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)
 
    def compute_initial_figure(self):
        pass
 
class MyStaticMplCanvas(MyMplCanvas):
    def compute_initial_figure(self):
        t = arange(0.0, 3.0, 0.01)
        s = sin(2*pi*t)
        self.axes.plot(t, s)
 
 
class ApplicationWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setWindowTitle("Window")
        sc = MyStaticMplCanvas(self, width=5, height=4, dpi=100)
        
        vbox = QVBoxLayout()
        box_layout = QWidget()
        
        buttonbox = QHBoxLayout()
        btn = QPushButton("Button 1")
        btn.clicked.connect(self.btn_1_clicked)
        buttonbox.addWidget(btn)
        
        btn2 = QPushButton("Button 2")
        buttonbox.addWidget(btn2)
        
        btn3 = QPushButton("Button 3")
        buttonbox.addWidget(btn3)
        
        vbox.addLayout(buttonbox)
        box_layout.setLayout(vbox)
        
        label = QLabel("Some Text ...")
        vbox.addWidget(label)
        
        # 100px space
        space = QWidget()
        space.setFixedHeight(100)
        vbox.addWidget(space)
        
        vbox.addWidget(sc)
        self.setCentralWidget(box_layout)
        self.setGeometry(50, 50, 800, 600)
        
    def btn_1_clicked(self):
        print(f"Button 1 clicked")
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
 
    aw = ApplicationWindow()
    aw.setWindowTitle("PyQt5 Matplot Example")
    aw.show()
    app.exec()
Reply
#9
For spectrum analyzer you can use pyqtgraph

https://github.com/sbarratt/spectrum-analyzer

[Image: demo.png]
Reply
#10
Hi,
I started from beginning and now I have no clue how to make tight layout of the plot? Any suggestion please?


import sys
import matplotlib
matplotlib.use('Qt5Agg')

from PyQt5 import QtCore, QtGui, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure


class MplCanvas(FigureCanvasQTAgg):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        sc = MplCanvas(self, width=5, height=4, dpi=100)
        sc.axes.plot([0,1,2,3,4], [10,1,20,3,40])

        # Create toolbar, passing canvas as first parament, parent (self, the MainWindow) as second.
        toolbar = NavigationToolbar(sc, self)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(toolbar)
        layout.addWidget(sc)

        # Create a placeholder widget to hold our toolbar and canvas.
        widget = QtWidgets.QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.show()


app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()
Thanks
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Matplotlib: How do I convert Dates from Excel to use in Matplotlib JaneTan 1 3,259 Mar-11-2021, 10:52 AM
Last Post: buran

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020