使用PyQtGraph對可視化數據進行實時更新。
文章首發於州的先生博客:
在之前介紹PyQtGraph的文章中,我們都是一次性的獲取數據並將其繪製為圖形。然而在很多場景中,我們都需要對實時的數據進行圖形化展示,比如:股票的實時行情、儀器設備的實時狀態等,這時候就需要對數據進行實時的更新和繪製。
今天我們就來介紹一下在PyQtGraph中根據實時數據更新繪製圖形。
今天的例子我們通過編寫一個電腦CPU實時使用率助手來講解。
在Windows操作系統的電腦上,我們通過「任務管理器」可以很方便地查看到自己電腦CPU實時的使用情況,並且CPU的佔用率還會通過一個實時的圖形區域顯示出來,如下圖所示:
通過實時變化的CPU利用率圖形,我們可以清晰地看到CPU使用情況的變化。在Python中,我們也能很方便的獲取到計算機CPU的實時使用率。
# coding:utf-8 # @文件: 1.py # @創建者:州的先生 # #日期:2019/5/12 # 博客地址:https://zmister.com
import psutil cpu = "CPU:%0.2f" % psutil.cpu_percent(interval=1) + "%" print(cpu)
通過運行上述代碼,我們就能獲取到此時電腦CPU的使用率。通過將其改進一下,加入循環和時間間隔,我們就可以持續獲得當前電腦CPU的使用率,如下代碼所示:
# coding:utf-8 # @文件: 1.py # @創建者:州的先生 # #日期:2019/5/12 # 博客地址:zmister.com
import psutil import time
def get_cpu_info(): cpu = "CPU:%0.2f" % psutil.cpu_percent(interval=1) + "%" return cpu
def main(): while True: info = get_cpu_info() print(info) time.sleep(1)
if __name__ == "__main__": main()
運行上述代碼,我們將每隔1秒獲取到實時的CPU使用率數據,這將是我們圖形界面程序的數據來源。
有了數據來源之後,我們來創建一個圖形界面,這個圖形界面由一個Widget包裹著一個Plotwidget,圖形界面的核心就是一個ptqtgraph的圖形部件。其代碼如下所示:
from PyQt5 import QtWidgets,QtCore,QtGui import tushare as ts import pyqtgraph as pg import sys import datetime import traceback import numpy as np
class MainUi(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("CPU使用率監控 - 州的先生https://zmister.com") self.main_widget = QtWidgets.QWidget() # 創建一個主部件 self.main_layout = QtWidgets.QGridLayout() # 創建一個網格佈局 self.main_widget.setLayout(self.main_layout) # 設置主部件的佈局為網格 self.setCentralWidget(self.main_widget) # 設置窗口默認部件
self.plot_widget = QtWidgets.QWidget() # 實例化一個widget部件作為K線圖部件 self.plot_layout = QtWidgets.QGridLayout() # 實例化一個網格佈局層 self.plot_widget.setLayout(self.plot_layout) # 設置線圖部件的佈局層 self.plot_plt = pg.PlotWidget() # 實例化一個繪圖部件 self.plot_plt.showGrid(x=True,y=True) # 顯示圖形網格 self.plot_layout.addWidget(self.plot_plt) # 添加繪圖部件到線圖部件的網格佈局層 # 將上述部件添加到佈局層中 self.main_layout.addWidget(self.plot_widget, 1, 0, 3, 3)
self.setCentralWidget(self.main_widget)
def main(): app = QtWidgets.QApplication(sys.argv) gui = MainUi() gui.show() sys.exit(app.exec_())
if __name__ == __main__: main()
運行上述代碼,我們將會得到一個如下圖所示的圖形界面:
我們的CPU使用率數據將會通過圖形界面中間的畫布部件顯示出來。
創建好了基礎的圖形界面之後,我們就可以實時獲取電腦CPU的使用率然後將其繪製在圖形界面上了。
在之前的文章中,我們知道pyqtgraph的繪圖數據主要是通過setData()這個方法來轉化為圖形。我們可以設置一個定時器,每隔一個時間重新調用setData()方法對圖形數據進行設置,就能夠實現實時的數據可視化呈現。下面我們通過代碼演示一下:
from PyQt5 import QtWidgets,QtCore,QtGui import pyqtgraph as pg import sys import traceback import psutil
self.plot_widget = QtWidgets.QWidget() # 實例化一個widget部件作為K線圖部件 self.plot_layout = QtWidgets.QGridLayout() # 實例化一個網格佈局層 self.plot_widget.setLayout(self.plot_layout) # 設置K線圖部件的佈局層 self.plot_plt = pg.PlotWidget() # 實例化一個繪圖部件 self.plot_plt.showGrid(x=True,y=True) # 顯示圖形網格 self.plot_layout.addWidget(self.plot_plt) # 添加繪圖部件到K線圖部件的網格佈局層 # 將上述部件添加到佈局層中 self.main_layout.addWidget(self.plot_widget, 1, 0, 3, 3)
self.setCentralWidget(self.main_widget) self.plot_plt.setYRange(max=100,min=0) self.data_list = [] self.timer_start()
# 啟動定時器 時間間隔秒 def timer_start(self): self.timer = QtCore.QTimer(self) self.timer.timeout.connect(self.get_cpu_info) self.timer.start(1000)
# 獲取CPU使用率 def get_cpu_info(self): try: cpu = "%0.2f" % psutil.cpu_percent(interval=1) self.data_list.append(float(cpu)) print(float(cpu)) self.plot_plt.plot().setData(self.data_list,pen=g) except Exception as e: print(traceback.print_exc())
在上述代碼中,我們定義了一個1秒鐘的計時器,然後定義了一個數據列表data_list,獲取到的cpu使用率都將添加到這個列表中,然後作為圖形數據傳遞給pyqtgraph。
運行上述代碼,我們可以得到如下動圖所示的實時更新圖形界面,每一秒獲取到的CPU使用率數據都實時繪製為了線條:
由於所有的操作都是在主線程上進行的,會導致圖形界面有些許的卡頓,更加理想的做法是創建一個子線程來生成和繪製圖形,在此就不作額外的演示了,大家可以自己嘗試一下。