日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

qt如何做到实时显示数据_Python 如何实时绘制数据

發布時間:2023/12/19 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt如何做到实时显示数据_Python 如何实时绘制数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提到 GUI 繪圖,大家可能第一反應是 OpenGL 和 Matplotlib,但其實基于 Qt 平臺還有個功能強大的 pyqtgraph 繪圖庫,不僅支持豐富的圖形種類,還能實時更新繪圖數據并進行交互式操作。

不同于網上其他文章或代碼講解,今天我們集中只關注實時繪制數據功能的實現。為了更精準學習該 pyqtgraph 模塊功能,我們將參考官方給出的實例來邊學邊練。

1. pyqtgraph 簡介

1.1 pyqtgraph 特點

關于 pyqtgraph 與 Matplotlib 的對比,大致要點如下:

  • pyqtgraph 在畫圖方面不如 Matplotlib 功能完整和成熟,但運行更快
  • Matplotlib 旨在繪制高質量圖像,pyqtgraph 則主要面向數據抓取和數據分析的應用
  • 相比 Matplotlib,pyqtgraph 對 python 和 qt 編程更親和
  • pyqtgraph 具備更好的圖像交互、3D展示等
  • 1.2 pyqtgraph 安裝

    一般配合 PyQt5 使用,這些都要預先安裝好,我們這里只提 pyqtgraph 相關:

    pip install pyqtgraph

    1.3 pyqtgraph 實例全集

    官方專門給出了一個實例集合,包含了展示與源碼,非常方便學習,通過以下代碼來運行:

    import pyqtgraph.examples pyqtgraph.examples.run()

    運行后,會出現如下 GUI 界面

    今天我們主要關注實時繪制數據,找到左側目錄中的 "Scrolling plots",單擊右側可以看到源碼

    雙擊或者點擊下方的 "Run Example" 便可展示運行效果:

    特定截圖:

    2. 實時繪制學習

    結合著實例代碼和演示效果,我們可以看到有如下不同實時展示模式:

    • 模式1: 從 0 開始固定 x 軸數值范圍,數據在該范圍內向左移動展示
    • 模式2: 數據帶著 x 軸坐標一起向左移動展示
    • 模式3: 固定 x 軸數值右側范圍到 0,數據左移展示
    • 模式4: 左側固定從 0 開始,數據累積展示
    • 模式5: 數據范圍右側截止到 0,但仍可查看大于 0 范圍

    2.1 模式1: 固定 x 范圍,左移展示數據

    2.1.1 模式1效果

    2.1.2 實例1代碼

    我們可以在實例匯總的代碼中將該部分代碼抽離出來,大致如下:

    import pyqtgraph as pg from pyqtgraph.Qt import QtCore, QtGui import numpy as npwin = pg.GraphicsLayoutWidget(show=True) win.setWindowTitle('Scrolling Plots Mode 1')p1 = win.addPlot() data1 = np.random.normal(size=300)curve1 = p1.plot(data1)def update1():global data1, ptr1data1[:-1] = data1[1:] # shift data in the array one sample left# (see also: np.roll)data1[-1] = np.random.normal()curve1.setData(data1)timer = pg.QtCore.QTimer() timer.timeout.connect(update1) timer.start(50)## Start Qt event loop unless running in interactive mode or using pyside. if __name__ == '__main__':import sysif (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):QtGui.QApplication.instance().exec_()

    注意,模式 1 中實時繪制效果的實現,是通過將數據列表中的數據整體左移實現的,關鍵語句就是 data1[:-1] = data1[1:],再通過計時器來綁定該左移數據的函數,最終達到了展示中的數據動態展示效果。

    2.1.3 寫成 PlotWidget 形式

    總結下模式 1 的原理:x 坐標數據不變化,對應的 y 數據設置個左移變換的函數,計時器信號綁定該左移數據的函數,把 y 數據能實時設置到圖中即可。

    實例 1 中繪制圖的寫法比較少見,通常應用是通過 pyqtgraph.PlotWidget.plot() 來實現在控件中作圖再添加到 GUI 控件中,所以我們將采用 PlotWidget 的寫法來實現模式1的繪制,代碼如下:

    __author__ = 'Ted'from PyQt5.Qt import * from pyqtgraph import PlotWidget from PyQt5 import QtCore import numpy as np import pyqtgraph as pqclass Window(QWidget):def __init__(self):super().__init__()# 設置下尺寸self.resize(600,600)# 添加 PlotWidget 控件self.plotWidget_ted = PlotWidget(self)# 設置該控件尺寸和相對位置self.plotWidget_ted.setGeometry(QtCore.QRect(25,25,550,550))# 仿寫 mode1 代碼中的數據# 生成 300 個正態分布的隨機數self.data1 = np.random.normal(size=300)self.curve1 = self.plotWidget_ted.plot(self.data1, name="mode1")# 設定定時器self.timer = pq.QtCore.QTimer()# 定時器信號綁定 update_data 函數self.timer.timeout.connect(self.update_data)# 定時器間隔50ms,可以理解為 50ms 刷新一次數據self.timer.start(50)# 數據左移def update_data(self):self.data1[:-1] = self.data1[1:]self.data1[-1] = np.random.normal()# 數據填充到繪制曲線中self.curve1.setData(self.data1)if __name__ == '__main__':import sys# PyQt5 程序固定寫法app = QApplication(sys.argv)# 將綁定了繪圖控件的窗口實例化并展示window = Window()window.show()# PyQt5 程序固定寫法sys.exit(app.exec())

    我們在自己寫的代碼中重新設置了下窗口尺寸位置,數據還是按照實例中的寫法來完成的。

    2.1.4 自寫模式1效果

    2.2 數據隨 x 軸一起左移

    2.2.1 模式2效果

    2.2.2 實例2代碼

    該模式代碼抽離出來大致如下:

    import pyqtgraph as pg from pyqtgraph.Qt import QtCore, QtGui import numpy as npwin = pg.GraphicsLayoutWidget(show=True) win.setWindowTitle('pyqtgraph example: Scrolling Plots')p2 = win.addPlot() data1 = np.random.normal(size=300)curve2 = p2.plot(data1) ptr1 = 0def update1():global data1, ptr1data1[:-1] = data1[1:] # shift data in the array one sample leftdata1[-1] = np.random.normal()ptr1 += 1curve2.setData(data1)curve2.setPos(ptr1, 0)timer = pg.QtCore.QTimer() timer.timeout.connect(update1) timer.start(50)if __name__ == '__main__':import sysif (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):QtGui.QApplication.instance().exec_()

    對比模式1代碼,此部分多了個 curve2.setPos(ptr1, 0),通過 Qt 官網中搜索查閱,setPos(x,y) 是將原點設置到 (x,y):

    ? Sets the position of the item to pos, which is in parent coordinates. For items with no parent, pos is in scene coordinates. The position of the item describes its origin (local coordinate (0, 0)) in parent coordinates.
    ?

    這樣我們可以大致理解為,通過設置坐標系相對原點位置來產生 x 軸移動的效果。

    2.2.3 寫成 PlotWidget 形式

    總結下模式 2 的原理: y 數據與模式1相同,設置左移變換的函數,計時器信號綁定該左移數據的函數,把 y 數據能實時設置到圖中;x 數據則通過 setPos() 函數隨著 y 的變化同步進行設置,產生 x 軸同步移動的效果。

    我們繼續采用 PlotWidget 的寫法來實現模式2的繪制,在模式1基礎上添加幾行代碼即可,為作區分我們把曲線定義為 curve2:

    __author__ = 'Ted'from PyQt5.Qt import * from pyqtgraph import PlotWidget from PyQt5 import QtCore import numpy as np import pyqtgraph as pqclass Window(QWidget):def __init__(self):super().__init__()# 設置下尺寸self.resize(600,600)# 添加 PlotWidget 控件self.plotWidget_ted = PlotWidget(self)# 設置該控件尺寸和相對位置self.plotWidget_ted.setGeometry(QtCore.QRect(25,25,550,550))# 仿寫 mode1 代碼中的數據# 生成 300 個正態分布的隨機數self.data1 = np.random.normal(size=300)self.curve2 = self.plotWidget_ted.plot(self.data1, name="mode2")self.ptr1 = 0# 設定定時器self.timer = pq.QtCore.QTimer()# 定時器信號綁定 update_data 函數self.timer.timeout.connect(self.update_data)# 定時器間隔50ms,可以理解為 50ms 刷新一次數據self.timer.start(50)# 數據左移def update_data(self):self.data1[:-1] = self.data1[1:]self.data1[-1] = np.random.normal()# 數據填充到繪制曲線中self.curve2.setData(self.data1)# x 軸記錄點self.ptr1 += 1# 重新設定 x 相關的坐標原點self.curve2.setPos(self.ptr1,0)if __name__ == '__main__':import sys# PyQt5 程序固定寫法app = QApplication(sys.argv)# 將綁定了繪圖控件的窗口實例化并展示window = Window()window.show()# PyQt5 程序固定寫法sys.exit(app.exec())

    我們在自己寫的代碼中重新設置了下窗口尺寸位置,數據還是按照實例中的寫法來完成的。

    2.2.4 自寫模式1效果

    3. 小結

    今天先只簡單整理這兩個較簡單的實時繪制模式,給定的代碼中數據是用的隨機正態分布數據,我們結合著模式 1 和 2 的實例代碼來分析其原理算法來仿寫了常用版本的代碼。

    掌握模式 1 和模式 2 的用法后,我們便可以對更多的數據來進行動態展示,比如 CPU 占用率、股票實時價格等,配合著 PyQt5 的 GUI 圖形界面,那么完全可以用 Python 來寫出看著高大上的數據可視化界面了,這個后續我們再繼續研究。

    總結

    以上是生活随笔為你收集整理的qt如何做到实时显示数据_Python 如何实时绘制数据的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。