在qt5中嵌入matplotlib


1.需要導入的庫

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

2.創建類將qt與matplotlib的畫布連接

這一部分是參考官網上的歷程和其他人的博客寫的,原理不太清楚

class PlotCanvas(FigureCanvas):# 通過繼承FigureCanvas類,使得該類既是一個PyQt5的Qwidget,又是一個matplotlib的FigureCanvas,這是連接pyqt5與matplotlib的關鍵
 
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)# 創建一個Figure,注意:該Figure為matplotlib下的figure,不是matplotlib.pyplot下面的figure
        self.axes = fig.add_subplot(111)# 調用figure下面的add_subplot方法,類似於matplotlib.pyplot下面的subplot方法
 
        FigureCanvas.__init__(self, fig)# 初始化父類
        self.setParent(parent)
 
        FigureCanvas.setSizePolicy(self,
                QSizePolicy.Expanding,
                QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)
        self.plot()
 
 
    def plot(self):
        data = [random.random() for i in range(25)]
        ax = self.figure.add_subplot(111)
        ax.plot(data, 'r-')
        ax.set_title('PyQt Matplotlib Example')
        self.draw()

3.示例程序

import sys
 
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget, QPushButton
from PyQt5.QtGui import QIcon
 
 
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
 
import random
 
class App(QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.left = 10
        self.top = 10
        self.title = 'PyQt5 matplotlib example - pythonspot.com'
        self.width = 640
        self.height = 400
        self.initUI()
 
    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
 
        m = PlotCanvas(self, width=5, height=4)
        m.move(0,0)
 
        button = QPushButton('PyQt5 button', self)
        button.setToolTip('This s an example button')
        button.move(500,0)
        button.resize(140,100)
 
        self.show()
 
 
class PlotCanvas(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)
 
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
 
        FigureCanvas.setSizePolicy(self,
                QSizePolicy.Expanding,
                QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)
        self.plot()
 
 
    def plot(self):
        data = [random.random() for i in range(25)]
        ax = self.figure.add_subplot(111)
        ax.plot(data, 'r-')
        ax.set_title('PyQt Matplotlib Example')
        self.draw()
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

 

4.定時更新圖像

自己加的一個小功能,每秒刷新一次圖像,並對數據進行插值

class PlotCanvas(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)# 調用figure下面的add_subplot方法,類似於matplotlib.pyplot下面的subplot方法
        FigureCanvas.__init__(self,fig)
        self.setParent(parent)
        FigureCanvas.setSizePolicy(self,
                                   QtWidgets.QSizePolicy.Expanding,
                                   QtWidgets.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)
        self.test()

    def test(self):
        self.init_plot()
        #每秒更新一次圖像
        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.update_figure)
        timer.start(1000)

    def init_plot(self):
        x=[1,2,3,4,5,6,7,8,9]
        y=[23,21,32,13,3,132,13,3,1]
        self.axes.plot(x, y)

    def update_figure(self,x,y):
        x=numpy.linspace(0,10,10)
        y = [random.randint(0, 10) for i in range(10)]
        xx=numpy.linspace(0,10)
        f=interpolate.interp1d(x,y,'quadratic')#產生插值曲線的函數
        yy=f(xx)
        self.axes.cla()
        self.axes.plot(x,y,'o',xx,yy)
        self.draw()

 

 

參考資料:

PyQt5例程:https://pythonspot.com/en/pyqt5-matplotlib/

Matplotlib官方例程:https://matplotlib.org/examples/user_interfaces/embedding_in_qt5.html

Matplotlib植入PyQt5 + QT5的UI呈現:http://www.cnblogs.com/laoniubile/p/5904817.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM