1. 程式人生 > 程式設計 >PyQt5結合matplotlib繪圖的實現示例

PyQt5結合matplotlib繪圖的實現示例

參考網上的例子,實現了簡單的matplotlib pyqt5繪圖

相關知識點:
(1)pyqt5中新增控制元件要在佈局中新增
(2)佈局可以使用replaceWidget替換控制元件
(3)訊號與槽機制

timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_figure)

self.btnPlot.clicked.connect(self.plotButton_callback)

實現的效果

PyQt5結合matplotlib繪圖的實現示例

import sys
from PyQt5 import QtCore,QtGui,uic
from PyQt5.QtWidgets import QMainWindow,QAction,qApp,QApplication,QMessageBox,QVBoxLayout,QSizePolicy,QWidget

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 numpy as np

qtCreatorFile = "matplotlib_ui.ui"
# 使用uic載入
Ui_MainWindow,QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyMplCanvas(FigureCanvas):
  """這是一個視窗部件,即QWidget(當然也是FigureCanvasAgg)"""
  def __init__(self,parent=None,width=5,height=4,dpi=100):
    fig = Figure(figsize=(width,height),dpi=dpi)
    self.axes = fig.add_subplot(111)
    # 每次plot()呼叫的時候,我們希望原來的座標軸被清除(所以False)
    self.axes.hold(False)
    self.axes.grid('on')

    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 = np.arange(0.0,3.0,0.01)
    s = np.sin(2 * np.pi * t)
    self.axes.grid('on')
    self.axes.plot(t,s)


class MyDynamicMplCanvas(MyMplCanvas):
  """動態畫布:每秒自動更新,更換一條折線。"""
  def __init__(self,*args,**kwargs):
    MyMplCanvas.__init__(self,**kwargs)
    timer = QtCore.QTimer(self)
    timer.timeout.connect(self.update_figure)
    timer.start(1000)

  def compute_initial_figure(self):
    self.axes.grid('on')
    self.axes.plot([0,1,2,3],[1,4],'r')

  def update_figure(self):
    # 構建4個隨機整數,位於閉區間[0,10]
    l = [np.random.randint(0,10) for i in range(4)]
    self.axes.grid('on')
    self.axes.plot([0,l,'r')
    self.draw()

class MyApp(QMainWindow,Ui_MainWindow):

  def __init__(self):
    QMainWindow.__init__(self)
    Ui_MainWindow.__init__(self)
    super().__init__()

    self.initUI()
    self.initBtn()
    self.initFrame()

  def initFrame(self):
    self.main_widget = self.frame
    self.layout = QVBoxLayout(self.main_widget)
    self.f = MyMplCanvas(self.main_widget)
    self.layout.addWidget(self.f)

  def initUI(self):        

    self.setupUi(self)
    self.setWindowTitle("PyQt5結合Matplotlib繪圖")
    self.setWindowIcon(QIcon("rocket.ico"))  # 設定圖示,linux下只有工作列會顯示圖示

    self.show()

  def initBtn(self):
    self.btnPlot.clicked.connect(self.plotButton_callback)
    self.btnPlot.setToolTip("Button")     

  def plotButton_callback(self):

    self.drawFrame()

  def drawFrame(self):

    sc = MyStaticMplCanvas(self.main_widget,dpi=100)
    dc = MyDynamicMplCanvas(self.f,dpi=100)
    self.layout.addWidget(sc)
    self.layout.replaceWidget(self.f,dc) # 替換控制元件

if __name__ == '__main__':

  app = QApplication(sys.argv)
  ex = MyApp()
  sys.exit(app.exec_())

參考連結:https://www.cnblogs.com/hhh5460/p/4322652.html

到此這篇關於PyQt5結合matplotlib繪圖的實現示例的文章就介紹到這了,更多相關PyQt5結合matplotlib內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!